diff options
| -rw-r--r-- | ivy.xml | 23 | ||||
| -rw-r--r-- | source/net/yacy/http/Jetty12HttpServer.java | 50 | ||||
| -rw-r--r-- | test/java/net/yacy/http/Jetty12HttpServerTest.java | 24 | ||||
| -rwxr-xr-x | test/jetty-solr-dependency-guard.sh | 7 |
4 files changed, 49 insertions, 55 deletions
@@ -94,27 +94,26 @@ <dependency org="org.bouncycastle" name="bcmail-jdk18on" rev="1.84" /> <dependency org="com.fasterxml.woodstox" name="woodstox-core" rev="7.2.1" /> <!-- Jetty 12 Core and EE8 form the public embedded-server runtime. --> - <dependency org="org.eclipse.jetty" name="jetty-http" rev="12.1.11" conf="compile->default"/> - <dependency org="org.eclipse.jetty" name="jetty-io" rev="12.1.11" conf="compile->default"/> + <dependency org="org.eclipse.jetty" name="jetty-http" rev="12.0.37" conf="compile->default"/> + <dependency org="org.eclipse.jetty" name="jetty-io" rev="12.0.37" conf="compile->default"/> <dependency org="org.eclipse.jetty" name="jetty-client" rev="9.4.58.v20250814" conf="solr9-bridge->master"/> - <dependency org="org.eclipse.jetty" name="jetty-proxy" rev="12.1.11" conf="compile->default"/> - <dependency org="org.eclipse.jetty" name="jetty-security" rev="12.1.11" conf="compile->default"/> - <dependency org="org.eclipse.jetty" name="jetty-server" rev="12.1.11" conf="compile->default"/> - <dependency org="org.eclipse.jetty" name="jetty-util" rev="12.1.11" conf="compile->default" /> - <dependency org="org.eclipse.jetty.compression" name="jetty-compression-server" rev="12.1.11" conf="compile->default"/> - <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-nested" rev="12.1.11" conf="compile->default"> + <dependency org="org.eclipse.jetty" name="jetty-proxy" rev="12.0.37" conf="compile->default"/> + <dependency org="org.eclipse.jetty" name="jetty-security" rev="12.0.37" conf="compile->default"/> + <dependency org="org.eclipse.jetty" name="jetty-server" rev="12.0.37" conf="compile->default"/> + <dependency org="org.eclipse.jetty" name="jetty-util" rev="12.0.37" conf="compile->default" /> + <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-nested" rev="12.0.37" conf="compile->default"> <exclude org="org.eclipse.jetty.toolchain" module="jetty-servlet-api"/> </dependency> - <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-security" rev="12.1.11" conf="compile->default"> + <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-security" rev="12.0.37" conf="compile->default"> <exclude org="org.eclipse.jetty.toolchain" module="jetty-servlet-api"/> </dependency> - <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-servlet" rev="12.1.11" conf="compile->default"> + <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-servlet" rev="12.0.37" conf="compile->default"> <exclude org="org.eclipse.jetty.toolchain" module="jetty-servlet-api"/> </dependency> - <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-servlets" rev="12.1.11" conf="compile->default"> + <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-servlets" rev="12.0.37" conf="compile->default"> <exclude org="org.eclipse.jetty.toolchain" module="jetty-servlet-api"/> </dependency> - <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-webapp" rev="12.1.11" conf="compile->default"> + <dependency org="org.eclipse.jetty.ee8" name="jetty-ee8-webapp" rev="12.0.37" conf="compile->default"> <exclude org="org.eclipse.jetty.toolchain" module="jetty-servlet-api"/> </dependency> <!-- Private Solr bridge inputs remain on Jetty 9. --> diff --git a/source/net/yacy/http/Jetty12HttpServer.java b/source/net/yacy/http/Jetty12HttpServer.java index 16590266c..f38a1a8d0 100644 --- a/source/net/yacy/http/Jetty12HttpServer.java +++ b/source/net/yacy/http/Jetty12HttpServer.java @@ -37,10 +37,6 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.eclipse.jetty.compression.gzip.GzipCompression; -import org.eclipse.jetty.compression.gzip.GzipDecoderConfig; -import org.eclipse.jetty.compression.server.CompressionConfig; -import org.eclipse.jetty.compression.server.CompressionHandler; import org.eclipse.jetty.ee8.security.ConstraintSecurityHandler; import org.eclipse.jetty.ee8.security.RoleInfo; import org.eclipse.jetty.ee8.security.authentication.DigestAuthenticator; @@ -49,7 +45,6 @@ import org.eclipse.jetty.ee8.servlet.ServletHolder; import org.eclipse.jetty.ee8.webapp.WebAppContext; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.http.HttpVersion; -import org.eclipse.jetty.http.MimeTypes; import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.UserPrincipal; @@ -64,6 +59,7 @@ import org.eclipse.jetty.server.SecureRequestCustomizer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; +import org.eclipse.jetty.server.handler.gzip.GzipHandler; import org.eclipse.jetty.server.handler.InetAccessHandler; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.security.Credential; @@ -203,38 +199,24 @@ public class Jetty12HttpServer implements YaCyHttpServer { security.setLoginService(loginService); webApp.setSecurityHandler(security); - final CompressionHandler compressionHandler = new CompressionHandler(webApp.get()); - final GzipCompression gzip = new GzipCompression(); - final GzipDecoderConfig decoder = new GzipDecoderConfig(); - decoder.setBufferSize(HttpServerBootstrapConfig.REQUEST_INFLATE_BUFFER_SIZE); - gzip.setDefaultDecoderConfig(decoder); - compressionHandler.putCompression(gzip); - compressionHandler.putConfiguration("/*", - createCompressionConfig(bootstrap.gzipResponsesEnabled())); - return compressionHandler; + return createGzipHandler(webApp.get(), bootstrap.gzipResponsesEnabled()); } - static CompressionConfig createCompressionConfig(final boolean gzipResponsesEnabled) { - final CompressionConfig.Builder compression = CompressionConfig.builder() - .compressIncludeMethod("GET") - .decompressIncludeMethod("POST"); - for (final String type : MimeTypes.DEFAULTS.getMimeMap().values()) { - if ("image/svg+xml".equals(type)) { - compression.compressExcludePath("*.svgz").decompressExcludePath("*.svgz"); - } else if (type.startsWith("image/") || type.startsWith("audio/") - || type.startsWith("video/")) { - compression.compressExcludeMimeType(type).decompressExcludeMimeType(type); - } - } - for (final String type : new String[] {"application/compress", "application/zip", - "application/gzip", "application/bzip2", "application/brotli", - "application/x-xz", "application/x-rar-compressed"}) { - compression.compressExcludeMimeType(type).decompressExcludeMimeType(type); - } + static GzipHandler createGzipHandler(final Handler handler, final boolean gzipResponsesEnabled) { + final GzipHandler gzip = new GzipHandler(handler); + gzip.setIncludedMethods(HttpMethod.GET.asString()); + gzip.setInflateBufferSize(HttpServerBootstrapConfig.REQUEST_INFLATE_BUFFER_SIZE); + gzip.addIncludedInflationPaths("/*"); + gzip.addExcludedInflationPaths("*.svgz"); if (!gzipResponsesEnabled) { - compression.compressExcludeMethod("GET").compressExcludeMethod("POST"); - } - return compression.build(); + gzip.addExcludedMethods(HttpMethod.GET.asString()); + } + /* + * Jetty 12.1 replaced GzipHandler with CompressionHandler plus + * GzipCompression/GzipDecoderConfig. Restore that adapter when YaCy moves + * back to 12.1 or later; it also supports method-specific decompression. + */ + return gzip; } @Override diff --git a/test/java/net/yacy/http/Jetty12HttpServerTest.java b/test/java/net/yacy/http/Jetty12HttpServerTest.java index 160188358..457eaa8ae 100644 --- a/test/java/net/yacy/http/Jetty12HttpServerTest.java +++ b/test/java/net/yacy/http/Jetty12HttpServerTest.java @@ -23,7 +23,6 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.eclipse.jetty.compression.server.CompressionConfig; import org.eclipse.jetty.ee8.security.authentication.DigestAuthenticator; import org.eclipse.jetty.ee8.servlet.ServletContextHandler; import org.eclipse.jetty.ee8.servlet.ServletHolder; @@ -34,6 +33,7 @@ import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.SecureRequestCustomizer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.handler.gzip.GzipHandler; import org.eclipse.jetty.server.handler.InetAccessHandler; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.security.Credential; @@ -79,7 +79,7 @@ public class Jetty12HttpServerTest { 0, "127.0.0.1", 1, null, -1); assertFalse(server.withSSL()); assertEquals(-1, server.getSslPort()); - assertTrue(server.getVersion().startsWith("Jetty 12.1.11")); + assertTrue(server.getVersion().startsWith("Jetty 12.0.37")); try { server.startupServer(); @@ -116,10 +116,22 @@ public class Jetty12HttpServerTest { @Test public void preservesJetty9SvgCompressionContract() { - final CompressionConfig compression = Jetty12HttpServer.createCompressionConfig(true); - assertTrue(compression.isCompressMimeTypeSupported("image/svg+xml")); - assertFalse(compression.isCompressMimeTypeSupported("image/png")); - assertTrue(compression.isCompressMethodSupported("GET")); + final GzipHandler compression = Jetty12HttpServer.createGzipHandler(null, true); + assertTrue(compression.isMimeTypeDeflatable("image/svg+xml")); + assertFalse(compression.isMimeTypeDeflatable("image/png")); + assertEquals(HttpServerBootstrapConfig.REQUEST_INFLATE_BUFFER_SIZE, + compression.getInflateBufferSize()); + assertTrue(java.util.Arrays.asList(compression.getIncludedMethods()).contains("GET")); + assertTrue(java.util.Arrays.asList(compression.getIncludedInflationPaths()).contains("/*")); + assertTrue(java.util.Arrays.asList(compression.getExcludedInflationPaths()).contains("*.svgz")); + } + + @Test + public void canDisableGzipResponsesWithoutDisablingRequestInflation() { + final GzipHandler compression = Jetty12HttpServer.createGzipHandler(null, false); + assertTrue(java.util.Arrays.asList(compression.getExcludedMethods()).contains("GET")); + assertEquals(HttpServerBootstrapConfig.REQUEST_INFLATE_BUFFER_SIZE, + compression.getInflateBufferSize()); } @Test diff --git a/test/jetty-solr-dependency-guard.sh b/test/jetty-solr-dependency-guard.sh index f90302a4f..9347c4fd7 100755 --- a/test/jetty-solr-dependency-guard.sh +++ b/test/jetty-solr-dependency-guard.sh @@ -41,7 +41,7 @@ fi grep -E 'name="jetty-client".*conf="solr9-bridge->master"' ivy.xml >/dev/null 2>&1 || \ fail "jetty-client must only be a direct input of the Solr 9 bridge" -server_jetty_version=12.1.11 +server_jetty_version=12.0.37 for artifact in jetty-http jetty-io jetty-proxy jetty-security jetty-server jetty-util; do grep -E "org=\"org.eclipse.jetty\" name=\"$artifact\" rev=\"$server_jetty_version\" conf=\"compile->default\"" ivy.xml >/dev/null 2>&1 || \ @@ -52,8 +52,9 @@ for artifact in jetty-ee8-nested jetty-ee8-security jetty-ee8-servlet jetty-ee8- grep -E "org=\"org.eclipse.jetty.ee8\" name=\"$artifact\" rev=\"$server_jetty_version\" conf=\"compile->default\"" ivy.xml >/dev/null 2>&1 || \ fail "$artifact $server_jetty_version must be an explicit production EE8 dependency" done -grep -E "org=\"org.eclipse.jetty.compression\" name=\"jetty-compression-server\" rev=\"$server_jetty_version\" conf=\"compile->default\"" ivy.xml >/dev/null 2>&1 || \ - fail "Jetty 12 compression server support must be on the production classpath" +if grep -E 'org="org.eclipse.jetty.compression"|name="jetty-compression-' ivy.xml >/dev/null 2>&1; then + fail "Jetty 12.1 compression modules must not be declared on the Jetty 12.0 classpath" +fi if grep -E 'conf="jetty12-migration|rev="9\.4\.58\.v20250814" conf="compile' ivy.xml >/dev/null 2>&1; then fail "ivy.xml still contains an isolated migration configuration or public Jetty 9 dependency" |
