diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index febb6fe2ff..27a76c31b0 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -74,7 +74,7 @@ jobs: run: mvn -B -V -Dstyle.color=always --file log/pom.xml clean verify - name: Felix HTTP if: steps.changes.outputs.http == 'true' - run: mvn -B -V -Dstyle.color=always "-Dit.test=!MissingWebsocketDependenciesIT" --file http/pom.xml clean install verify + run: mvn -B -V -Dstyle.color=always "-Dit.test=!MissingWebsocketDependenciesIT" --file http/pom.xml clean install verify "-Dmaven.repo.local=/home/runner/.m2/repository/" - name: Felix Maven bundle plugin if: steps.changes.outputs.maven-bundle-plugin == 'true' run: mvn -B -V -Dstyle.color=always --file tools/maven-bundle-plugin/pom.xml clean install verify diff --git a/http/README.md b/http/README.md index d49e879a56..256632ff25 100644 --- a/http/README.md +++ b/http/README.md @@ -5,7 +5,7 @@ This is an implementation of the [R8.1 Whiteboard Specification for Jakarta Serv * Standard OSGi Http Service implementation * Standard OSGi Http Whiteboard implementation * Run either with Jetty (version 11 or 12) bundle or inside your own application server using the servlet bridge - * [Felix HTTP Jetty 12](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.jetty12) is the preferred bundle of choice as it supports JakartaEE10 with the `jakarta` namespace. + * [Felix HTTP Jetty 12](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.jetty12) is the preferred bundle of choice as it supports JakartaEE10 (1.0.x range) and JakartaEE11 (1.1.x range). * [Jetty WebSocket support](https://github.com/apache/felix-dev/pull/310), see example code [here](https://github.com/apache/felix-dev/blob/master/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServlet.java). * [Felix HTTP Jetty 11](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.jetty) is the predecessor of the Jetty 12 bundle, which shipped with [Jetty 9.4.x](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.jetty/4.2.26) in the 4.x range (JavaEE8), [Jetty 11.x](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.jetty/5.1.10) in the 5.x range (JakartaEE9). * [Jetty WebSocket support](https://github.com/apache/felix-dev/pull/309), see example code [here](https://github.com/apache/felix-dev/blob/master/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServlet.java). @@ -15,9 +15,9 @@ This is an implementation of the [R8.1 Whiteboard Specification for Jakarta Serv The Apache Felix HTTP Service project includes several bundles. - * [`org.apache.felix.http.servlet-api`](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.servlet-api) - Provides the Servlet API (versions 2.6, 3.0, 3.1, 4.0, 5.0 and 6.0 of the Servlet specification) + * [`org.apache.felix.http.servlet-api`](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.servlet-api) - Provides the Servlet API (versions 2.6, 3.0, 3.1, 4.0, 5.0, 6.0 and 6.1 of the Servlet specification) * [`org.apache.felix.http.api`](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.api) - Provides the OSGi APIs for the Http Whiteboard and Http Service. - * [`org.apache.felix.http.jetty12`](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.jetty12) - Implementation that is embedding Jetty server (currently Jetty 12.x, requiring Java 17). This bundle includes the http.api bundle. It's the the preferred Felix Jetty bundle to use, as Jetty 11 will be [EoL in 2025](https://github.com/jetty/jetty.project/issues/10485). + * [`org.apache.felix.http.jetty12`](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.jetty12) - Implementation that is embedding Jetty server (currently Jetty 12.1.x, requiring Java 17). This bundle includes the http.api bundle. It's the the preferred Felix Jetty bundle to use, as Jetty 11 will be [EoL in 2025](https://github.com/jetty/jetty.project/issues/10485). * [`org.apache.felix.http.jetty`](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.jetty) - Predecessor implementation that is embedding Jetty server (currently Jetty 11.x, requiring Java 11). This bundle includes the http.api bundle. * [`org.apache.felix.http.sslfilter`](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.sslfilter) - Servlet filter for handling SSL termination. * [`org.apache.felix.http.bridge`](https://mvnrepository.com/artifact/org.apache.felix/org.apache.felix.http.bridge) - Implementation that uses the host application server (bridged mode). Must be used with the proxy (see below) @@ -31,8 +31,8 @@ classpath and deployment! ### Using classifiers: `light`, `with-jetty-websockets` and `with-jakarta-websockets` bundle If you would like to use your own Jetty jars instead of the one packaged with the Felix Jetty bundles, you can use the variants with the following classifiers: * `light` - A light version of the bundle that does not include the Jetty classes. This is useful when you want to use your own Jetty jars. Available for both Jetty bundles. -* `with-jetty-websockets` - A bundle that includes the classes required for Jetty WebSocket support for Jakarta EE10. Jetty12 bundle only. -* `with-jakarta-websockets` - A bundle that includes the classes required for Jakarta WebSocket support for Jakarta EE10. Jetty12 bundle only. +* `with-jetty-websockets` - A bundle that includes the classes required for Jetty WebSocket support for Jakarta EE10 (1.0.x) and Jakarta EE11 (1.1.x). Jetty12 bundle only. +* `with-jakarta-websockets` - A bundle that includes the classes required for Jakarta WebSocket support for Jakarta EE10 (1.0.x) and Jakarta EE11 (1.1.x). Jetty12 bundle only. When building the Felix Jetty bundle with Maven (`mvn clean install`), the additional bundles will be created in the `target` directory, postfixed with classifier. This jar can be deployed to your Felix OSGi environment, along with a compatible Jetty jars. diff --git a/http/base/pom.xml b/http/base/pom.xml index a1fd0259cc..a3db9ed995 100644 --- a/http/base/pom.xml +++ b/http/base/pom.xml @@ -159,9 +159,9 @@ test - org.eclipse.jetty.ee10.websocket - jetty-ee10-websocket-jetty-server - 12.0.22 + org.eclipse.jetty.ee11.websocket + jetty-ee11-websocket-jetty-server + 12.1.0.beta1 test diff --git a/http/base/src/test/java/org/apache/felix/http/base/internal/handler/WebSocketHandlerTest.java b/http/base/src/test/java/org/apache/felix/http/base/internal/handler/WebSocketHandlerTest.java index e635a50f1d..3b7a39700f 100644 --- a/http/base/src/test/java/org/apache/felix/http/base/internal/handler/WebSocketHandlerTest.java +++ b/http/base/src/test/java/org/apache/felix/http/base/internal/handler/WebSocketHandlerTest.java @@ -21,7 +21,7 @@ import static org.mockito.Mockito.mock; import org.apache.felix.http.javaxwrappers.ServletWrapper; -import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee11.websocket.server.JettyWebSocketServlet; import org.junit.Before; import org.junit.Test; diff --git a/http/itest/pom.xml b/http/itest/pom.xml index df93733d2e..00e1d372a0 100644 --- a/http/itest/pom.xml +++ b/http/itest/pom.xml @@ -45,7 +45,7 @@ 17 6.1.0 - 1.0.35-SNAPSHOT + 1.1.0-SNAPSHOT org.apache.felix.http.jetty12 diff --git a/http/jetty12/pom.xml b/http/jetty12/pom.xml index aff259b401..0321152d98 100644 --- a/http/jetty12/pom.xml +++ b/http/jetty12/pom.xml @@ -30,7 +30,7 @@ This is an implementation of the R8.1 OSGi Servlet Service, the R7 OSGi Http Service and the R7 OSGi Http Whiteboard Specification org.apache.felix.http.jetty12 - 1.0.35-SNAPSHOT + 1.1.0-SNAPSHOT bundle @@ -42,7 +42,7 @@ 17 - 12.0.22 + 12.1.0.beta1 true 4.13.3 @@ -75,9 +75,9 @@ if (artifact.getArtifactHandler().isAddedToClasspath() && !org.apache.maven.artifact.Artifact.SCOPE_TEST.equals( artifact.getScope() ) && !"org.eclipse.jetty.websocket".equals(artifact.getGroupId()) // skip the optional websocket artifacts - && !"org.eclipse.jetty.ee10.websocket".equals(artifact.getGroupId()) // skip the optional websocket artifacts - && !"jetty-annotations".equals(artifact.getArtifactId()) // skip the transitive artifacts from the optional websocket artifacts - && !"jetty-plus".equals(artifact.getArtifactId()) + && !"org.eclipse.jetty.ee11.websocket".equals(artifact.getGroupId()) // skip the optional websocket artifacts + && !"jetty-ee11-annotations".equals(artifact.getArtifactId()) // skip the transitive artifacts from the optional websocket artifacts + && !"jetty-ee11-plus".equals(artifact.getArtifactId()) && !"jetty-webapp".equals(artifact.getArtifactId()) && !"jetty-ee".equals(artifact.getArtifactId())) { def jar; @@ -184,8 +184,9 @@ org.eclipse.jetty.server.*, org.eclipse.jetty.util.*, org.eclipse.jetty.ee.*, - !org.eclipse.jetty.ee10.websocket.*, - org.eclipse.jetty.ee10.servlet.*, + !org.eclipse.jetty.ee11.websocket.*, + org.eclipse.jetty.ee11.servlet.*, + org.eclipse.jetty.compression.*, org.apache.felix.http.jetty, org.apache.felix.http.jakartawrappers, org.apache.felix.http.javaxwrappers @@ -372,10 +373,11 @@ org.eclipse.jetty.server.*, org.eclipse.jetty.util.*, org.eclipse.jetty.ee.*, - org.eclipse.jetty.ee10.servlet.*, - !org.eclipse.jetty.ee10.websocket.jakarta.*, - org.eclipse.jetty.ee10.websocket.*, + org.eclipse.jetty.ee11.servlet.*, + !org.eclipse.jetty.ee11.websocket.jakarta.*, + org.eclipse.jetty.ee11.websocket.*, org.eclipse.jetty.websocket.*, + org.eclipse.jetty.compression.*, org.apache.felix.http.jetty, org.apache.felix.http.jakartawrappers, org.apache.felix.http.javaxwrappers @@ -478,11 +480,12 @@ org.eclipse.jetty.server.*, org.eclipse.jetty.util.*, org.eclipse.jetty.ee.*, - !org.eclipse.jetty.ee10.websocket.server.*, - !org.eclipse.jetty.ee10.websocket.servlet.*, - org.eclipse.jetty.ee10.websocket.jakarta.*, - org.eclipse.jetty.ee10.servlet.*, + !org.eclipse.jetty.ee11.websocket.server.*, + !org.eclipse.jetty.ee11.websocket.servlet.*, + org.eclipse.jetty.ee11.websocket.jakarta.*, + org.eclipse.jetty.ee11.servlet.*, org.eclipse.jetty.websocket.*, + org.eclipse.jetty.compression.*, org.apache.felix.http.jetty, org.apache.felix.http.jakartawrappers, org.apache.felix.http.javaxwrappers @@ -634,8 +637,8 @@ provided - org.eclipse.jetty.ee10 - jetty-ee10-servlet + org.eclipse.jetty.ee11 + jetty-ee11-servlet ${jetty.version} @@ -684,14 +687,14 @@ ${jetty.version} - org.eclipse.jetty.ee10.websocket - jetty-ee10-websocket-jakarta-server + org.eclipse.jetty.ee11.websocket + jetty-ee11-websocket-jakarta-server ${jetty.version} true - org.eclipse.jetty.ee10.websocket - jetty-ee10-websocket-jetty-server + org.eclipse.jetty.ee11.websocket + jetty-ee11-websocket-jetty-server ${jetty.version} true @@ -706,6 +709,16 @@ jetty-session ${jetty.version} + + org.eclipse.jetty.compression + jetty-compression-gzip + ${jetty.version} + + + org.eclipse.jetty.compression + jetty-compression-common + ${jetty.version} + org.osgi org.osgi.service.servlet diff --git a/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyErrorHandler.java b/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyErrorHandler.java index 1a6c82bb7e..9fdfbda0de 100644 --- a/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyErrorHandler.java +++ b/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyErrorHandler.java @@ -18,7 +18,7 @@ import java.util.Map; -import org.eclipse.jetty.ee10.servlet.ErrorHandler; +import org.eclipse.jetty.ee11.servlet.ErrorHandler; import org.eclipse.jetty.http.HttpFields.Mutable; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Response; diff --git a/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java b/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java index 2dce509ec2..74c369002f 100644 --- a/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java +++ b/http/jetty12/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java @@ -43,10 +43,10 @@ import org.apache.felix.http.base.internal.HttpServiceController; import org.apache.felix.http.base.internal.logger.SystemLogger; import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory; -import org.eclipse.jetty.ee10.servlet.ServletContextHandler; -import org.eclipse.jetty.ee10.servlet.ServletHandler; -import org.eclipse.jetty.ee10.servlet.ServletHolder; -import org.eclipse.jetty.ee10.servlet.SessionHandler; +import org.eclipse.jetty.ee11.servlet.ServletContextHandler; +import org.eclipse.jetty.ee11.servlet.ServletHolder; +import org.eclipse.jetty.ee11.servlet.SessionHandler; +import org.eclipse.jetty.ee11.servlet.ServletHandler; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.UriCompliance; import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory; @@ -588,32 +588,32 @@ private boolean initializeHttps() * @param handler the sevlet context handler to initialize */ private void maybeInitializeJakartaWebsocket(ServletContextHandler handler) { - if (isClassNameVisible("org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer")) { + if (isClassNameVisible("org.eclipse.jetty.ee11.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer")) { // Ensure that JakartaWebSocketServletContainerInitializer is initialized, // to setup the ServerContainer for this web application context. - org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer.configure(handler, null); - SystemLogger.LOGGER.info("Jakarta WebSocket EE10 servlet container initialized"); + org.eclipse.jetty.ee11.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer.configure(handler, null); + SystemLogger.LOGGER.info("Jakarta WebSocket ee11 servlet container initialized"); } else { - SystemLogger.LOGGER.warn("Failed to initialize jakarta EE10 standard websocket support since the initializer class was not found. " - + "Check if the jetty-ee10-websocket-jakarta-server bundle is deployed."); + SystemLogger.LOGGER.warn("Failed to initialize jakarta ee11 standard websocket support since the initializer class was not found. " + + "Check if the jetty-ee11-websocket-jakarta-server bundle is deployed."); } } /** - * Initialize the jetty EE10 websocket support for the servlet context handler. + * Initialize the jetty ee11 websocket support for the servlet context handler. * If the optional initializer class is not present then a warning will be logged. * * @param handler the sevlet context handler to initialize */ private void maybeInitializeJettyWebsocket(ServletContextHandler handler) { - if (isClassNameVisible("org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer")) { + if (isClassNameVisible("org.eclipse.jetty.ee11.websocket.server.config.JettyWebSocketServletContainerInitializer")) { // Ensure that JettyWebSocketServletContainerInitializer is initialized, // to setup the JettyWebSocketServerContainer for this web application context. - org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer.configure(handler, null); - SystemLogger.LOGGER.info("Jetty WebSocket EE10 servlet container initialized"); + org.eclipse.jetty.ee11.websocket.server.config.JettyWebSocketServletContainerInitializer.configure(handler, null); + SystemLogger.LOGGER.info("Jetty WebSocket ee11 servlet container initialized"); } else { - SystemLogger.LOGGER.warn("Failed to initialize jetty EE10 specific websocket support since the initializer class was not found. " - + "Check if the jetty-ee10-websocket-jetty-server bundle is deployed."); + SystemLogger.LOGGER.warn("Failed to initialize jetty ee11 specific websocket support since the initializer class was not found. " + + "Check if the jetty-ee11-websocket-jetty-server bundle is deployed."); } } @@ -626,13 +626,13 @@ private void maybeStoreWebSocketContainerAttributes(ServletContextHandler contex // when the server is started, retrieve the container attribute and // set it on the shared servlet context once available if (this.config.isUseJettyWebsocket() && - isClassNameVisible("org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer")) { - String attribute = org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServerContainer.JETTY_WEBSOCKET_CONTAINER_ATTRIBUTE; + isClassNameVisible("org.eclipse.jetty.ee11.websocket.server.config.JettyWebSocketServletContainerInitializer")) { + String attribute = org.eclipse.jetty.ee11.websocket.server.JettyWebSocketServerContainer.JETTY_WEBSOCKET_CONTAINER_ATTRIBUTE; this.controller.setAttributeSharedServletContext(attribute, context.getServletContext().getAttribute(attribute)); } if (this.config.isUseJakartaWebsocket() && - isClassNameVisible("org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer")) { - String attribute = org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer.ATTR_JAKARTA_SERVER_CONTAINER; + isClassNameVisible("org.eclipse.jetty.ee11.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer")) { + String attribute = org.eclipse.jetty.ee11.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer.ATTR_JAKARTA_SERVER_CONTAINER; this.controller.setAttributeSharedServletContext(attribute, context.getServletContext().getAttribute(attribute)); } } diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/AbstractJettyTestSupport.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/AbstractJettyTestSupport.java index d42ef43d3e..51874f2089 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/AbstractJettyTestSupport.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/AbstractJettyTestSupport.java @@ -43,7 +43,7 @@ import org.ops4j.pax.exam.util.PathUtils; public abstract class AbstractJettyTestSupport { - protected static final String JETTY_VERSION = "12.0.22"; + protected static final String JETTY_VERSION = "12.1.0.beta1"; private final String workingDirectory = String.format("%s/target/paxexam/%s/%s", PathUtils.getBaseDir(), getClass().getSimpleName(), UUID.randomUUID()); diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JakartaSpecificWebsocketIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JakartaSpecificWebsocketIT.java index 1c2ec9e613..f1e7458044 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JakartaSpecificWebsocketIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JakartaSpecificWebsocketIT.java @@ -43,7 +43,7 @@ import jakarta.websocket.server.ServerEndpoint; import org.awaitility.Awaitility; -import org.eclipse.jetty.ee10.websocket.jakarta.client.JakartaWebSocketClientContainerProvider; +import org.eclipse.jetty.ee11.websocket.jakarta.client.JakartaWebSocketClientContainerProvider; import org.junit.Test; import org.junit.runner.RunWith; import org.ops4j.pax.exam.Option; @@ -71,19 +71,21 @@ protected Option[] additionalOptions() throws IOException { spifly(), // bundles for the server side - mavenBundle().groupId("jakarta.websocket").artifactId("jakarta.websocket-api").version("2.1.1"), - mavenBundle().groupId("jakarta.websocket").artifactId("jakarta.websocket-client-api").version("2.1.1"), + mavenBundle().groupId("jakarta.websocket").artifactId("jakarta.websocket-api").version("2.2.0"), + mavenBundle().groupId("jakarta.websocket").artifactId("jakarta.websocket-client-api").version("2.2.0"), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-client").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-client").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-webapp").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-webapp").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-ee").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.compression").artifactId("jetty-compression-gzip").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.compression").artifactId("jetty-compression-common").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-core-client").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-core-common").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-core-server").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10.websocket").artifactId("jetty-ee10-websocket-jakarta-client").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10.websocket").artifactId("jetty-ee10-websocket-jakarta-common").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10.websocket").artifactId("jetty-ee10-websocket-jakarta-server").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10.websocket").artifactId("jetty-ee10-websocket-servlet").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11.websocket").artifactId("jetty-ee11-websocket-jakarta-client").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11.websocket").artifactId("jetty-ee11-websocket-jakarta-common").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11.websocket").artifactId("jetty-ee11-websocket-jakarta-server").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11.websocket").artifactId("jetty-ee11-websocket-servlet").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-xml").version(jettyVersion) }; } diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyMaxFormSizeIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyMaxFormSizeIT.java index a0e71667ff..3160aa6eef 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyMaxFormSizeIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyMaxFormSizeIT.java @@ -35,7 +35,6 @@ import org.eclipse.jetty.client.ContentResponse; import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP; import org.eclipse.jetty.util.Fields; import org.junit.Before; import org.junit.Test; @@ -64,9 +63,9 @@ protected Option[] additionalOptions() throws IOException { spifly(), // bundles for the server side - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-webapp").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-webapp").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-ee").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-servlet").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-servlet").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-xml").version(jettyVersion), // additional bundles for the client side @@ -94,30 +93,27 @@ public void setup(){ @Test public void testFormSizeLimit() throws Exception { - HttpClientTransportOverHTTP transport = new HttpClientTransportOverHTTP(); - HttpClient httpClient = new HttpClient(transport); - httpClient.start(); + try (HttpClient httpClient = new HttpClient()) { + httpClient.start(); + Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); + int httpPort = Integer.parseInt((String) value); - Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); - int httpPort = Integer.parseInt((String) value); + URI uri = new URI(String.format("http://localhost:%d/endpoint", httpPort)); - URI uri = new URI(String.format("http://localhost:%d/endpoint", httpPort)); + Fields formFields = new Fields(); + formFields.add(new Fields.Field("key", "value")); // under 10 bytes + ContentResponse response = httpClient.FORM(uri, formFields); - Fields formFields = new Fields(); - formFields.add(new Fields.Field("key", "value")); // under 10 bytes - ContentResponse response = httpClient.FORM(uri, formFields); + assertEquals(200, response.getStatus()); + assertEquals("OK", response.getContentAsString()); - assertEquals(200, response.getStatus()); - assertEquals("OK", response.getContentAsString()); + Fields formFieldsLimitExceeded = new Fields(); + formFieldsLimitExceeded.add(new Fields.Field("key", "valueoverlimit")); // over limit of 10 bytes + ContentResponse responseExceeded = httpClient.FORM(uri, formFieldsLimitExceeded); - Fields formFieldsLimitExceeded = new Fields(); - formFieldsLimitExceeded.add(new Fields.Field("key", "valueoverlimit")); // over limit of 10 bytes - ContentResponse responseExceeded = httpClient.FORM(uri, formFieldsLimitExceeded); - - // HTTP 500 thrown, because req.getParameter("key") throws an IOException - assertEquals(500, responseExceeded.getStatus()); - - httpClient.close(); + // HTTP 500 thrown, because req.getParameter("key") throws an IOException + assertEquals(500, responseExceeded.getStatus()); + } } static final class HelloWorldServlet extends HttpServlet { diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySizeLimitHandlerIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySizeLimitHandlerIT.java index 179726bf9b..2eb12c69fb 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySizeLimitHandlerIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySizeLimitHandlerIT.java @@ -25,6 +25,8 @@ import java.net.URI; import java.util.Hashtable; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import javax.inject.Inject; import jakarta.servlet.Servlet; @@ -33,9 +35,11 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.eclipse.jetty.client.CompletableResponseListener; import org.eclipse.jetty.client.ContentResponse; +import org.eclipse.jetty.client.FormRequestContent; import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP; +import org.eclipse.jetty.client.Request; import org.eclipse.jetty.util.Fields; import org.junit.Before; import org.junit.Test; @@ -63,9 +67,9 @@ protected Option[] additionalOptions() throws IOException { spifly(), // bundles for the server side - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-webapp").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-webapp").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-ee").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-servlet").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-servlet").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-xml").version(jettyVersion), // additional bundles for the client side @@ -97,34 +101,40 @@ public void setup(){ @Test public void testRequestResponseLimits() throws Exception { - HttpClientTransportOverHTTP transport = new HttpClientTransportOverHTTP(); - HttpClient httpClient = new HttpClient(transport); - httpClient.start(); - - Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); - int httpPort = Integer.parseInt((String) value); - - Fields formFields = new Fields(); - formFields.add(new Fields.Field("key", "value")); // under 10 bytes - ContentResponse responseWithinLimit = httpClient.FORM(new URI(String.format("http://localhost:%d/withinlimit/a", httpPort)), formFields); - - // Request limit ok, response limit ok - assertEquals(200, responseWithinLimit.getStatus()); - assertEquals("OK", responseWithinLimit.getContentAsString()); - - // Request limit ok, response limit exceeded - // org.eclipse.jetty.http.HttpException$RuntimeException: 500: Response body is too large: 17>10 - ContentResponse responseExceedingLimit = httpClient.FORM(new URI(String.format("http://localhost:%d/exceedinglimit/a", httpPort)), formFields); - assertEquals(500, responseExceedingLimit.getStatus()); - - Fields formFieldsLimitExceeded = new Fields(); - formFieldsLimitExceeded.add(new Fields.Field("key", "valueoverlimit")); // over limit of 10 bytes - ContentResponse responseExceeded = httpClient.FORM(new URI(String.format("http://localhost:%d/withinlimit/a", httpPort)), formFieldsLimitExceeded); - - // Request limit exceeded, HTTP 413 directly from Jetty - assertEquals(413, responseExceeded.getStatus()); - - httpClient.close(); + try (HttpClient httpClient = new HttpClient()) { + httpClient.start(); + Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); + int httpPort = Integer.parseInt((String) value); + + Fields formFields = new Fields(); + formFields.add(new Fields.Field("key","value")); // under 10 bytes + ContentResponse responseWithinLimit = httpClient.FORM(new URI(String.format("http://localhost:%d/withinlimit/a", httpPort)), formFields); + + // Request limit ok, response limit ok + assertEquals(200, responseWithinLimit.getStatus()); + assertEquals("OK", responseWithinLimit.getContentAsString()); + + // Request limit ok, response limit exceeded + // org.eclipse.jetty.http.HttpException$RuntimeException: 500: Response body is too large: 17>10 + ContentResponse responseExceedingLimit = httpClient.FORM(new URI(String.format("http://localhost:%d/exceedinglimit/a", httpPort)), formFields); + + assertEquals(500, responseExceedingLimit.getStatus()); + + Fields formFieldsLimitExceeded = new Fields(); + formFieldsLimitExceeded.add(new Fields.Field("key","valueoverlimit")); // over limit of 10 bytes + + Request request = httpClient.newRequest(new URI(String.format("http://localhost:%d/withinlimit/a", httpPort))) + .body(new FormRequestContent(formFieldsLimitExceeded)); + + try { + CompletableFuture completable = new CompletableResponseListener(request).send(); + ContentResponse response = completable.get(); + assertEquals(413, response.getStatus()); + } catch (ExecutionException e) { + // FIXME this shouldn't happen, but it does with Jetty 12.1.0.beta1 + // java.nio.channels.AsynchronousCloseException + } + } } static final class HelloWorldServletWithinLimit extends HttpServlet { diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySpecificWebsocketIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySpecificWebsocketIT.java index 27b33bc9d0..5cbf8e3f65 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySpecificWebsocketIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettySpecificWebsocketIT.java @@ -41,9 +41,9 @@ import org.awaitility.Awaitility; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP; -import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServerContainer; -import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServletFactory; +import org.eclipse.jetty.ee11.websocket.server.JettyWebSocketServerContainer; +import org.eclipse.jetty.ee11.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee11.websocket.server.JettyWebSocketServletFactory; import org.eclipse.jetty.websocket.api.Callback; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; @@ -80,20 +80,22 @@ protected Option[] additionalOptions() throws IOException { spifly(), // bundles for the server side - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-webapp").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-webapp").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-core-common").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-core-server").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-jetty-api").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-jetty-common").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-jetty-server").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10.websocket").artifactId("jetty-ee10-websocket-servlet").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10.websocket").artifactId("jetty-ee10-websocket-jetty-server").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11.websocket").artifactId("jetty-ee11-websocket-servlet").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11.websocket").artifactId("jetty-ee11-websocket-jetty-server").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-xml").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-ee").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.compression").artifactId("jetty-compression-common").version(jettyVersion), // additional bundles for the client side mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-client").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-client").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.compression").artifactId("jetty-compression-gzip").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-core-client").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty.websocket").artifactId("jetty-websocket-jetty-client").version(jettyVersion) }; diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyUriComplianceModeDefaultIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyUriComplianceModeDefaultIT.java index 3ad003242c..9c6e957cf8 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyUriComplianceModeDefaultIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyUriComplianceModeDefaultIT.java @@ -35,7 +35,6 @@ import org.eclipse.jetty.client.ContentResponse; import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -60,14 +59,16 @@ protected Option[] additionalOptions() throws IOException { spifly(), // bundles for the server side - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-webapp").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-webapp").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-ee").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-servlet").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-servlet").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-xml").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.compression").artifactId("jetty-compression-common").version(jettyVersion), // additional bundles for the client side mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-client").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-client").version(jettyVersion) + mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-client").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.compression").artifactId("jetty-compression-gzip").version(jettyVersion) }; } @@ -89,33 +90,30 @@ public void setup(){ @Test public void testUriCompliance() throws Exception { - HttpClientTransportOverHTTP transport = new HttpClientTransportOverHTTP(); - HttpClient httpClient = new HttpClient(transport); - httpClient.start(); + try (HttpClient httpClient = new HttpClient()) { + httpClient.start(); + Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); + int httpPort = Integer.parseInt((String) value); - Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); - int httpPort = Integer.parseInt((String) value); + URI destUriWorking = new URI(String.format("http://localhost:%d/endpoint/working", httpPort)); + URI destUriAmbigousPath = new URI("http://localhost:" + httpPort + "/endpoint/ambigousPathitem_0_http%3A%2F%2Fwww.test.com%2F0.html/abc"); - URI destUriWorking = new URI(String.format("http://localhost:%d/endpoint/working", httpPort)); - URI destUriAmbigousPath = new URI("http://localhost:" + httpPort + "/endpoint/ambigousPathitem_0_http%3A%2F%2Fwww.test.com%2F0.html/abc"); + ContentResponse response = httpClient.GET(destUriWorking); + assertEquals(200, response.getStatus()); + assertEquals("OK", response.getContentAsString()); - ContentResponse response = httpClient.GET(destUriWorking); - assertEquals(200, response.getStatus()); - assertEquals("OK", response.getContentAsString()); + // Validate custom headers in case of success page, should not be present + assertNull(response.getHeaders().get("Strict-Transport-Security")); + assertNull(response.getHeaders().get("X-Custom-Header")); - // Validate custom headers in case of success page, should not be present - assertNull(response.getHeaders().get("Strict-Transport-Security")); - assertNull(response.getHeaders().get("X-Custom-Header")); - - // blocked with HTTP 400 by default - // validate custom headers in case of error page - ContentResponse responseAmbiguousPath = httpClient.GET(destUriAmbigousPath); - assertEquals(400, responseAmbiguousPath.getStatus()); - assertEquals("max-age=31536000", responseAmbiguousPath.getHeaders().get("Strict-Transport-Security")); - assertEquals("123", responseAmbiguousPath.getHeaders().get("X-Custom-Header")); - - httpClient.close(); + // blocked with HTTP 400 by default + // validate custom headers in case of error page + ContentResponse responseAmbiguousPath = httpClient.GET(destUriAmbigousPath); + assertEquals(400, responseAmbiguousPath.getStatus()); + assertEquals("max-age=31536000", responseAmbiguousPath.getHeaders().get("Strict-Transport-Security")); + assertEquals("123", responseAmbiguousPath.getHeaders().get("X-Custom-Header")); + } } static final class UriComplianceEndpoint extends HttpServlet { diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyUriComplianceModeLegacyIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyUriComplianceModeLegacyIT.java index cd228e0271..8b2944bc5d 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyUriComplianceModeLegacyIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyUriComplianceModeLegacyIT.java @@ -18,34 +18,19 @@ import static org.eclipse.jetty.http.UriCompliance.LEGACY; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.ops4j.pax.exam.CoreOptions.mavenBundle; import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration; -import java.io.IOException; import java.net.URI; -import java.util.Hashtable; -import java.util.Map; - -import javax.inject.Inject; -import jakarta.servlet.Servlet; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import org.eclipse.jetty.client.ContentResponse; import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP; -import org.eclipse.jetty.http.UriCompliance; import org.junit.Test; import org.junit.runner.RunWith; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; import org.ops4j.pax.exam.spi.reactors.PerClass; -import org.osgi.framework.BundleContext; import org.osgi.service.http.HttpService; -import org.osgi.service.servlet.whiteboard.HttpWhiteboardConstants; @RunWith(PaxExam.class) @ExamReactorStrategy(PerClass.class) @@ -61,25 +46,22 @@ protected Option felixHttpConfig(int httpPort) { @Test public void testUriCompliance() throws Exception { - HttpClientTransportOverHTTP transport = new HttpClientTransportOverHTTP(); - HttpClient httpClient = new HttpClient(transport); - httpClient.start(); - - Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); - int httpPort = Integer.parseInt((String) value); - - URI destUriWorking = new URI(String.format("http://localhost:%d/endpoint/working", httpPort)); - URI destUriAmbigousPath = new URI("http://localhost:" + httpPort + "/endpoint/ambigousPathitem_0_http%3A%2F%2Fwww.test.com%2F0.html/abc"); + try (HttpClient httpClient = new HttpClient()) { + httpClient.start(); + Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); + int httpPort = Integer.parseInt((String) value); - ContentResponse response = httpClient.GET(destUriWorking); - assertEquals(200, response.getStatus()); - assertEquals("OK", response.getContentAsString()); + URI destUriWorking = new URI(String.format("http://localhost:%d/endpoint/working", httpPort)); + URI destUriAmbigousPath = new URI("http://localhost:" + httpPort + "/endpoint/ambigousPathitem_0_http%3A%2F%2Fwww.test.com%2F0.html/abc"); - // no longer blocked due to LEGACY compliance mode - ContentResponse response2 = httpClient.GET(destUriAmbigousPath); - assertEquals(200, response2.getStatus()); - assertEquals("OK", response2.getContentAsString()); + ContentResponse response = httpClient.GET(destUriWorking); + assertEquals(200, response.getStatus()); + assertEquals("OK", response.getContentAsString()); - httpClient.close(); + // no longer blocked due to LEGACY compliance mode + ContentResponse response2 = httpClient.GET(destUriAmbigousPath); + assertEquals(200, response2.getStatus()); + assertEquals("OK", response2.getContentAsString()); + } } } \ No newline at end of file diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsIT.java index 0b79d51195..0acc5c79dd 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsIT.java @@ -34,7 +34,6 @@ import org.eclipse.jetty.client.ContentResponse; import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -60,14 +59,16 @@ protected Option[] additionalOptions() throws IOException { spifly(), // bundles for the server side - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-webapp").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-webapp").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-ee").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-servlet").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-servlet").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-xml").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.compression").artifactId("jetty-compression-common").version(jettyVersion), // additional bundles for the client side mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-client").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-client").version(jettyVersion) + mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-client").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.compression").artifactId("jetty-compression-gzip").version(jettyVersion) }; } @@ -93,20 +94,17 @@ public void testJettyRunningWithVirtualThreads() throws Exception { // This test only works on Java 21 or newer return; } - HttpClientTransportOverHTTP transport = new HttpClientTransportOverHTTP(); - HttpClient httpClient = new HttpClient(transport); - httpClient.start(); + try (HttpClient httpClient = new HttpClient()) { + httpClient.start(); + Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); + int httpPort = Integer.parseInt((String) value); - Object value = bundleContext.getServiceReference(HttpService.class).getProperty("org.osgi.service.http.port"); - int httpPort = Integer.parseInt((String) value); + URI destUri = new URI(String.format("http://localhost:%d/endpoint/working", httpPort)); - URI destUri = new URI(String.format("http://localhost:%d/endpoint/working", httpPort)); - - ContentResponse response = httpClient.GET(destUri); - assertEquals(200, response.getStatus()); - assertEquals("OK", response.getContentAsString()); - - httpClient.close(); + ContentResponse response = httpClient.GET(destUri); + assertEquals(200, response.getStatus()); + assertEquals("OK", response.getContentAsString()); + } } static final class ExampleEndpoint extends HttpServlet { diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsThreadPoolIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsThreadPoolIT.java index e22a2b775a..7b4d19cdfb 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsThreadPoolIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/JettyVirtualThreadsThreadPoolIT.java @@ -16,35 +16,13 @@ */ package org.apache.felix.http.jetty.it; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.ops4j.pax.exam.CoreOptions.mavenBundle; import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.newConfiguration; -import java.io.IOException; -import java.net.URI; -import java.util.Hashtable; -import java.util.Map; - -import javax.inject.Inject; -import jakarta.servlet.Servlet; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import org.eclipse.jetty.client.ContentResponse; -import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP; -import org.junit.Before; -import org.junit.Test; import org.junit.runner.RunWith; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; import org.ops4j.pax.exam.spi.reactors.PerClass; -import org.osgi.framework.BundleContext; -import org.osgi.service.http.HttpService; -import org.osgi.service.servlet.whiteboard.HttpWhiteboardConstants; @RunWith(PaxExam.class) @ExamReactorStrategy(PerClass.class) diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/LightClassifierIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/LightClassifierIT.java index 30c3f1fa80..ec25b7312c 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/LightClassifierIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/LightClassifierIT.java @@ -67,7 +67,7 @@ protected Option[] additionalOptions() throws IOException { mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-security").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-server").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-session").version(jettyVersion), - mavenBundle().groupId("org.eclipse.jetty.ee10").artifactId("jetty-ee10-servlet").version(jettyVersion), + mavenBundle().groupId("org.eclipse.jetty.ee11").artifactId("jetty-ee11-servlet").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-util").version(jettyVersion), mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-ee").version(jettyVersion), diff --git a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/MissingWebsocketDependenciesIT.java b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/MissingWebsocketDependenciesIT.java index d733197afb..d15f38f695 100644 --- a/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/MissingWebsocketDependenciesIT.java +++ b/http/jetty12/src/test/java/org/apache/felix/http/jetty/it/MissingWebsocketDependenciesIT.java @@ -68,11 +68,11 @@ public void testMissingDepencencyWarningLogs() throws Exception { .until(() -> containsString(logFile, "org.apache.felix.http.jetty12 [org.apache.felix.http]")); assertTrue(containsString(logFile, "org.apache.felix.http.jetty12 [org.apache.felix.http] WARN : Failed to " - + "initialize jetty EE10 specific websocket support since the initializer class was not found. " - + "Check if the jetty-ee10-websocket-jetty-server bundle is deployed.")); + + "initialize jetty ee11 specific websocket support since the initializer class was not found. " + + "Check if the jetty-ee11-websocket-jetty-server bundle is deployed.")); assertTrue(containsString(logFile, "org.apache.felix.http.jetty12 [org.apache.felix.http] WARN : Failed to " - + "initialize jakarta EE10 standard websocket support since the initializer class was not found. " - + "Check if the jetty-ee10-websocket-jakarta-server bundle is deployed.")); + + "initialize jakarta ee11 standard websocket support since the initializer class was not found. " + + "Check if the jetty-ee11-websocket-jakarta-server bundle is deployed.")); } /** diff --git a/http/pom.xml b/http/pom.xml index 39f83277a7..c9cedcce46 100644 --- a/http/pom.xml +++ b/http/pom.xml @@ -43,12 +43,12 @@ bridge inventoryprinter itest + servlet-api wrappers jetty jetty12 proxy samples/whiteboard - servlet-api sslfilter webconsoleplugin diff --git a/http/samples/whiteboard/pom.xml b/http/samples/whiteboard/pom.xml index ca772d81b5..547d70860a 100644 --- a/http/samples/whiteboard/pom.xml +++ b/http/samples/whiteboard/pom.xml @@ -39,7 +39,7 @@ - 12.0.22 + 12.1.0.beta1 @@ -78,7 +78,7 @@ jakarta.servlet jakarta.servlet-api - 5.0.0 + 6.1.0 provided @@ -96,7 +96,7 @@ org.apache.felix org.apache.felix.http.jetty12 - 1.0.21-SNAPSHOT + 1.1.0-SNAPSHOT provided @@ -112,14 +112,14 @@ provided - org.eclipse.jetty.ee10 - jetty-ee10-servlet + org.eclipse.jetty.ee11 + jetty-ee11-servlet ${jetty.version} provided - org.eclipse.jetty.ee10.websocket - jetty-ee10-websocket-jetty-server + org.eclipse.jetty.ee11.websocket + jetty-ee11-websocket-jetty-server ${jetty.version} provided diff --git a/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServlet.java b/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServlet.java index 77c1bd1c5c..f6685412b9 100644 --- a/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServlet.java +++ b/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServlet.java @@ -21,7 +21,7 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; -import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServerContainer; +import org.eclipse.jetty.ee11.websocket.server.JettyWebSocketServerContainer; import org.eclipse.jetty.websocket.api.Callback; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; diff --git a/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServletAlternative.java b/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServletAlternative.java index 133fc1b4fc..85ebba1b3e 100644 --- a/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServletAlternative.java +++ b/http/samples/whiteboard/src/main/java/org/apache/felix/http/samples/whiteboard/TestWebSocketServletAlternative.java @@ -19,8 +19,8 @@ import jakarta.servlet.ServletConfig; import jakarta.servlet.ServletException; -import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServlet; -import org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServletFactory; +import org.eclipse.jetty.ee11.websocket.server.JettyWebSocketServlet; +import org.eclipse.jetty.ee11.websocket.server.JettyWebSocketServletFactory; import org.eclipse.jetty.websocket.api.Callback; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; diff --git a/http/servlet-api/pom.xml b/http/servlet-api/pom.xml index c78f9a3b37..0a42af74be 100644 --- a/http/servlet-api/pom.xml +++ b/http/servlet-api/pom.xml @@ -63,7 +63,7 @@ org.apache.felix maven-bundle-plugin - 5.1.9 + 6.0.0 true diff --git a/http/wrappers/pom.xml b/http/wrappers/pom.xml index 131f392049..ddf2d83727 100644 --- a/http/wrappers/pom.xml +++ b/http/wrappers/pom.xml @@ -48,7 +48,7 @@ org.apache.felix maven-bundle-plugin - 5.1.9 + 6.0.0 true diff --git a/http/wrappers/src/main/java/org/apache/felix/http/jakartawrappers/HttpServletRequestWrapper.java b/http/wrappers/src/main/java/org/apache/felix/http/jakartawrappers/HttpServletRequestWrapper.java index d971ef0bdd..31505f7cfe 100644 --- a/http/wrappers/src/main/java/org/apache/felix/http/jakartawrappers/HttpServletRequestWrapper.java +++ b/http/wrappers/src/main/java/org/apache/felix/http/jakartawrappers/HttpServletRequestWrapper.java @@ -17,6 +17,8 @@ package org.apache.felix.http.jakartawrappers; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import java.security.Principal; import java.util.ArrayList; import java.util.Collection; @@ -263,4 +265,13 @@ public Map getTrailerFields() { public boolean isTrailerFieldsReady() { return this.request.isTrailerFieldsReady(); } + + @Override + public void setCharacterEncoding(Charset charset) { + try { + this.request.setCharacterEncoding(charset.name()); + } catch (UnsupportedEncodingException e) { + throw new IllegalArgumentException(e); + } + } } diff --git a/http/wrappers/src/main/java/org/apache/felix/http/jakartawrappers/HttpServletResponseWrapper.java b/http/wrappers/src/main/java/org/apache/felix/http/jakartawrappers/HttpServletResponseWrapper.java index b84884e03d..ff974f0658 100644 --- a/http/wrappers/src/main/java/org/apache/felix/http/jakartawrappers/HttpServletResponseWrapper.java +++ b/http/wrappers/src/main/java/org/apache/felix/http/jakartawrappers/HttpServletResponseWrapper.java @@ -17,13 +17,14 @@ package org.apache.felix.http.jakartawrappers; import java.io.IOException; +import java.nio.charset.Charset; import java.util.Collection; -import org.jetbrains.annotations.NotNull; - import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletResponse; +import org.jetbrains.annotations.NotNull; + /** * Http servlet response wrapper */ @@ -76,6 +77,18 @@ public void sendRedirect(final String location) throws IOException { this.response.sendRedirect(location); } + @Override + public void sendRedirect(String location, boolean clearBuffer) throws IOException { + this.response.sendRedirect(location); + this.response.flushBuffer(); + } + + @Override + public void sendRedirect(String location, int sc) throws IOException { + this.response.setStatus(sc); + this.response.sendRedirect(location); + } + @Override public void setDateHeader(final String name, final long date) { this.response.setDateHeader(name, date); @@ -141,4 +154,9 @@ public void sendRedirect(final String location, final int sc, final boolean clea } this.response.sendRedirect(location); } + + @Override + public void setCharacterEncoding(Charset encoding) { + this.response.setCharacterEncoding(encoding.name()); + } }