diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 97a3c2ebd89..fff2978f69f 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -57,12 +57,14 @@ updates:
versions: [ ">=4.0.0" ]
- dependency-name: "jakarta.enterprise:jakarta.enterprise.cdi-api:*"
versions: [ ">=3.0.0" ]
- - dependency-name: "com.sun.xml.ws:jaxws*"
+ - dependency-name: "com.sun.xml.ws:jaxws-rt"
versions: [ ">=3.0.0" ]
- dependency-name: "jakarta.transaction:*"
versions: [ ">=2.0.0" ]
- dependency-name: "org.infinispan:*"
versions: [ ">=12" ]
+ - dependency-name: "jakarta.xml.bind:*"
+ versions: [ ">=3.0.0" ]
- package-ecosystem: "maven"
directory: "/"
diff --git a/jetty-core/jetty-alpn/jetty-alpn-client/pom.xml b/jetty-core/jetty-alpn/jetty-alpn-client/pom.xml
index 3d55d94c5be..0e3a339ec59 100644
--- a/jetty-core/jetty-alpn/jetty-alpn-client/pom.xml
+++ b/jetty-core/jetty-alpn/jetty-alpn-client/pom.xml
@@ -17,19 +17,12 @@
org.apache.felix
maven-bundle-plugin
true
-
-
-
- manifest
-
-
-
- ${osgi.slf4j.import.packages},org.eclipse.jetty.alpn;resolution:=optional,*
- osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional, osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client)";resolution:=optional;cardinality:=multiple
-
-
-
-
+
+
+ ${osgi.slf4j.import.packages},org.eclipse.jetty.alpn;resolution:=optional,*
+ osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional, osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client)";resolution:=optional;cardinality:=multiple
+
+
diff --git a/jetty-core/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/internal/HttpStreamOverHTTP2.java b/jetty-core/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/internal/HttpStreamOverHTTP2.java
index 3b2ea29d8d8..4920d0ce95c 100644
--- a/jetty-core/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/internal/HttpStreamOverHTTP2.java
+++ b/jetty-core/jetty-http2/http2-server/src/main/java/org/eclipse/jetty/http2/server/internal/HttpStreamOverHTTP2.java
@@ -104,13 +104,11 @@ public class HttpStreamOverHTTP2 implements HttpStream, HTTP2Channel.Server
{
if (LOG.isDebugEnabled())
LOG.debug("onRequest", x);
- onBadMessage(x);
- return null;
+ return () -> onBadMessage(x);
}
catch (Throwable x)
{
- onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
- return null;
+ return () -> onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
}
}
@@ -432,13 +430,11 @@ public class HttpStreamOverHTTP2 implements HttpStream, HTTP2Channel.Server
}
catch (BadMessageException x)
{
- onBadMessage(x);
- return null;
+ return () -> onBadMessage(x);
}
catch (Throwable x)
{
- onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
- return null;
+ return () -> onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
}
}
diff --git a/jetty-core/jetty-http2/jetty-http2-tests/src/test/java/org/eclipse/jetty/http2/tests/BadURITest.java b/jetty-core/jetty-http2/jetty-http2-tests/src/test/java/org/eclipse/jetty/http2/tests/BadURITest.java
new file mode 100644
index 00000000000..13ad232bbfd
--- /dev/null
+++ b/jetty-core/jetty-http2/jetty-http2-tests/src/test/java/org/eclipse/jetty/http2/tests/BadURITest.java
@@ -0,0 +1,148 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others.
+//
+// This program and the accompanying materials are made available under the
+// terms of the Eclipse Public License v. 2.0 which is available at
+// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+// which is available at https://www.apache.org/licenses/LICENSE-2.0.
+//
+// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+// ========================================================================
+//
+
+package org.eclipse.jetty.http2.tests;
+
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jetty.http.HostPortHttpField;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpMethod;
+import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.http.MetaData;
+import org.eclipse.jetty.http2.frames.HeadersFrame;
+import org.eclipse.jetty.http2.frames.PrefaceFrame;
+import org.eclipse.jetty.http2.frames.SettingsFrame;
+import org.eclipse.jetty.http2.internal.generator.Generator;
+import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Response;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.handler.ErrorProcessor;
+import org.eclipse.jetty.util.BufferUtil;
+import org.eclipse.jetty.util.Callback;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class BadURITest
+{
+ private Server server;
+ private ServerConnector connector;
+
+ protected void startServer(Handler handler) throws Exception
+ {
+ server = new Server();
+ connector = new ServerConnector(server, 1, 1, new HTTP2CServerConnectionFactory(new HttpConfiguration()));
+ server.addConnector(connector);
+ server.setHandler(handler);
+ server.start();
+ }
+
+ @AfterEach
+ public void dispose()
+ {
+ LifeCycle.stop(server);
+ }
+
+ @Test
+ @Disabled("TODO: need to fix ErrorProcessor")
+ public void testBadURI() throws Exception
+ {
+ CountDownLatch handlerLatch = new CountDownLatch(1);
+ startServer(new Handler.Processor()
+ {
+ @Override
+ public void process(Request request, Response response, Callback callback)
+ {
+ handlerLatch.countDown();
+ callback.succeeded();
+ }
+ });
+
+ // Remove existing ErrorHandlers.
+ server.getBeans(ErrorProcessor.class).forEach(server::removeBean);
+
+ server.addBean(new ErrorProcessor()
+ {
+ @Override
+ public ByteBuffer badMessageError(int status, String reason, HttpFields.Mutable fields)
+ {
+ // Return a very large buffer that will cause HTTP/2 flow control exhaustion and/or TCP congestion.
+ return ByteBuffer.allocateDirect(128 * 1024 * 1024);
+ }
+ });
+
+ ByteBufferPool byteBufferPool = connector.getByteBufferPool();
+ Generator generator = new Generator(byteBufferPool);
+
+ // Craft a request with a bad URI, it will not hit the Handler.
+ MetaData.Request metaData1 = new MetaData.Request(
+ HttpMethod.GET.asString(),
+ HttpScheme.HTTP.asString(),
+ new HostPortHttpField("localhost:" + connector.getLocalPort()),
+ // Use an ambiguous path parameter so that the URI is invalid.
+ "/foo/..;/bar",
+ HttpVersion.HTTP_2,
+ HttpFields.EMPTY,
+ -1
+ );
+ ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
+ generator.control(lease, new PrefaceFrame());
+ generator.control(lease, new SettingsFrame(new HashMap<>(), false));
+ generator.control(lease, new HeadersFrame(1, metaData1, null, true));
+
+ try (Socket client = new Socket("localhost", connector.getLocalPort()))
+ {
+ OutputStream output = client.getOutputStream();
+ for (ByteBuffer buffer : lease.getByteBuffers())
+ {
+ output.write(BufferUtil.toArray(buffer));
+ }
+
+ // Wait for the first request be processed on the server.
+ Thread.sleep(1000);
+
+ // Send a second request and verify that it hits the Handler.
+ lease.recycle();
+ MetaData.Request metaData2 = new MetaData.Request(
+ HttpMethod.GET.asString(),
+ HttpScheme.HTTP.asString(),
+ new HostPortHttpField("localhost:" + connector.getLocalPort()),
+ "/valid",
+ HttpVersion.HTTP_2,
+ HttpFields.EMPTY,
+ -1
+ );
+ generator.control(lease, new HeadersFrame(3, metaData2, null, true));
+ for (ByteBuffer buffer : lease.getByteBuffers())
+ {
+ output.write(BufferUtil.toArray(buffer));
+ }
+ assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
+ }
+ }
+}
diff --git a/jetty-core/jetty-websocket/websocket-core-client/pom.xml b/jetty-core/jetty-websocket/websocket-core-client/pom.xml
index f995120e88f..e3700778439 100644
--- a/jetty-core/jetty-websocket/websocket-core-client/pom.xml
+++ b/jetty-core/jetty-websocket/websocket-core-client/pom.xml
@@ -36,19 +36,11 @@
org.apache.felix
maven-bundle-plugin
true
-
-
- generate-manifest
-
- manifest
-
-
-
- *,org.eclipse.jetty.websocket.core.client.internal.*
-
-
-
-
+
+
+ *,org.eclipse.jetty.websocket.core.client.internal.*
+
+
diff --git a/jetty-core/jetty-websocket/websocket-core-common/pom.xml b/jetty-core/jetty-websocket/websocket-core-common/pom.xml
index 0116123dedb..f6ae7b2817f 100644
--- a/jetty-core/jetty-websocket/websocket-core-common/pom.xml
+++ b/jetty-core/jetty-websocket/websocket-core-common/pom.xml
@@ -35,25 +35,18 @@
org.apache.felix
maven-bundle-plugin
true
-
-
- generate-manifest
-
- manifest
-
-
-
- *,org.eclipse.jetty.websocket.core.common.internal.*
-
- osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"
-
-
- osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.websocket.core.Extension
-
-
-
-
-
+
+
+ Jetty Websocket Core Common
+ *,org.eclipse.jetty.websocket.core.common.internal.*
+
+ osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"; resolution:=optional
+
+
+ osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.websocket.core.Extension
+
+
+
diff --git a/jetty-core/jetty-websocket/websocket-core-tests/pom.xml b/jetty-core/jetty-websocket/websocket-core-tests/pom.xml
index 4830dc624bb..4b182fc3a9d 100644
--- a/jetty-core/jetty-websocket/websocket-core-tests/pom.xml
+++ b/jetty-core/jetty-websocket/websocket-core-tests/pom.xml
@@ -85,6 +85,21 @@
true
+
+ org.apache.felix
+ maven-bundle-plugin
+
+
+
+ manifest
+
+
+
+ true
+
+
+
+
diff --git a/jetty-ee10/jetty-ee10-demos/demo-mock-resources/pom.xml b/jetty-ee10/jetty-ee10-demos/demo-mock-resources/pom.xml
index 204040de844..c3e8c066f6a 100644
--- a/jetty-ee10/jetty-ee10-demos/demo-mock-resources/pom.xml
+++ b/jetty-ee10/jetty-ee10-demos/demo-mock-resources/pom.xml
@@ -16,27 +16,19 @@
org.apache.felix
maven-bundle-plugin
- true
-
-
-
- manifest
-
-
-
- org.eclipse.jetty.demos.demo-mock-resources
- Mock resources used for testing
-
+
+
+ org.eclipse.jetty.demos.demo-mock-resources
+ Mock resources used for testing
+
org.example;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
-
-
- javax.sql, jakarta.transaction;version="2.0.0"
-
- <_nouses>true
-
-
-
-
+
+
+ javax.sql, jakarta.transaction;version="2.0.0"
+
+ <_nouses>true
+
+
diff --git a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/DefaultServletTest.java b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/DefaultServletTest.java
index c187b0a665a..db2fb89532e 100644
--- a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/DefaultServletTest.java
+++ b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/DefaultServletTest.java
@@ -39,6 +39,7 @@ import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
+import org.eclipse.jetty.http.CompressedContentFormat;
import org.eclipse.jetty.http.DateGenerator;
import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpHeader;
@@ -1960,6 +1961,51 @@ public class DefaultServletTest
assertThat(body, containsString("fake gzip"));
}
+ @Test
+ public void testProgrammaticCustomCompressionFormats() throws Exception
+ {
+ createFile(docRoot.resolve("data0.txt"), "Hello Text 0");
+ createFile(docRoot.resolve("data0.txt.br"), "fake brotli");
+ createFile(docRoot.resolve("data0.txt.gz"), "fake gzip");
+ createFile(docRoot.resolve("data0.txt.bz2"), "fake bzip2");
+
+ ResourceService resourceService = new ResourceService();
+ resourceService.setPrecompressedFormats(new CompressedContentFormat[]{
+ new CompressedContentFormat("bzip2", ".bz2"),
+ new CompressedContentFormat("gzip", ".gz"),
+ new CompressedContentFormat("br", ".br")
+ });
+ ServletHolder defholder = new ServletHolder(new DefaultServlet()); // TODO: how to integrate resource service / precompressed format
+ context.addServlet(defholder, "/");
+ defholder.setInitParameter("resourceBase", docRoot.toString());
+
+ String rawResponse;
+ HttpTester.Response response;
+ String body;
+
+ rawResponse = connector.getResponse("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:bzip2, br, gzip\r\n\r\n");
+ response = HttpTester.parseResponse(rawResponse);
+ assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
+ assertThat(response, containsHeaderValue(HttpHeader.CONTENT_LENGTH, "10"));
+ assertThat(response, containsHeaderValue(HttpHeader.CONTENT_TYPE, "text/plain"));
+ assertThat(response, containsHeaderValue(HttpHeader.VARY, "Accept-Encoding"));
+ assertThat(response, containsHeaderValue(HttpHeader.CONTENT_ENCODING, "bzip2"));
+ body = response.getContent();
+ assertThat(body, containsString("fake bzip2"));
+
+ // TODO: show accept-encoding search order issue (shouldn't this request return data0.txt.br?)
+
+ rawResponse = connector.getResponse("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:br, gzip\r\n\r\n");
+ response = HttpTester.parseResponse(rawResponse);
+ assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
+ assertThat(response, containsHeaderValue(HttpHeader.CONTENT_LENGTH, "9"));
+ assertThat(response, containsHeaderValue(HttpHeader.CONTENT_TYPE, "text/plain"));
+ assertThat(response, containsHeaderValue(HttpHeader.VARY, "Accept-Encoding"));
+ assertThat(response, containsHeaderValue(HttpHeader.CONTENT_ENCODING, "gzip"));
+ body = response.getContent();
+ assertThat(body, containsString("fake gzip"));
+ }
+
@Test
public void testControlCharacter() throws Exception
{
diff --git a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/GzipHandlerTest.java b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/GzipHandlerTest.java
index 373251bd574..3b078431975 100644
--- a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/GzipHandlerTest.java
+++ b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/GzipHandlerTest.java
@@ -40,6 +40,7 @@ import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.CompressedContentFormat;
+import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
@@ -54,6 +55,7 @@ import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
@@ -687,6 +689,49 @@ public class GzipHandlerTest
assertEquals(__icontent, testOut.toString("UTF8"));
}
+ @Test
+ public void testIncludeExcludeGzipHandlerInflate() throws Exception
+ {
+ gzipHandler.addExcludedInflationPaths("/ctx/echo/exclude");
+ gzipHandler.addIncludedInflationPaths("/ctx/echo/include");
+
+ String message = "hello world";
+ byte[] gzippedMessage = gzipContent(message);
+
+ // The included path does deflate the content.
+ HttpTester.Response response = sendGzipRequest("/ctx/echo/include", message);
+ assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
+ assertThat(response.getContent(), equalTo(message));
+
+ // The excluded path does not deflate the content.
+ response = sendGzipRequest("/ctx/echo/exclude", message);
+ assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
+ assertThat(response.getContentBytes(), equalTo(gzippedMessage));
+ }
+
+ private byte[] gzipContent(String content) throws IOException
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ GZIPOutputStream output = new GZIPOutputStream(baos);
+ output.write(content.getBytes(StandardCharsets.UTF_8));
+ output.close();
+ return baos.toByteArray();
+ }
+
+ private HttpTester.Response sendGzipRequest(String uri, String data) throws Exception
+ {
+ HttpTester.Request request = HttpTester.newRequest();
+ request.setMethod("GET");
+ request.setURI(uri);
+ request.setVersion("HTTP/1.0");
+ request.setHeader("Host", "tester");
+ request.setHeader("Content-Type", "text/plain");
+ request.setHeader("Content-Encoding", "gzip");
+ request.setContent(gzipContent(data));
+
+ return HttpTester.parseResponse(_connector.getResponse(request.generate()));
+ }
+
@Test
public void testAddGetPaths()
{
diff --git a/jetty-ee9/jetty-ee9-jaspi/pom.xml b/jetty-ee9/jetty-ee9-jaspi/pom.xml
index 135e65fb839..45b23287800 100644
--- a/jetty-ee9/jetty-ee9-jaspi/pom.xml
+++ b/jetty-ee9/jetty-ee9-jaspi/pom.xml
@@ -21,19 +21,12 @@
org.apache.felix
maven-bundle-plugin
true
-
-
-
- manifest
-
-
-
- osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"
- osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory
-
-
-
-
+
+
+ osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"
+ osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory
+
+
diff --git a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/StatisticsHandler.java b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/StatisticsHandler.java
index e0f5e6e16c8..8ae955b82e2 100644
--- a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/StatisticsHandler.java
+++ b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/StatisticsHandler.java
@@ -50,6 +50,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
private final LongAdder _expires = new LongAdder();
private final LongAdder _errors = new LongAdder();
+ private final LongAdder _responsesThrown = new LongAdder();
private final LongAdder _responses1xx = new LongAdder();
private final LongAdder _responses2xx = new LongAdder();
private final LongAdder _responses3xx = new LongAdder();
@@ -86,7 +87,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
long elapsed = System.currentTimeMillis() - request.getTimeStamp();
_requestStats.decrement();
_requestTimeStats.record(elapsed);
- updateResponse(request);
+ updateResponse(request, false);
_asyncWaitStats.decrement();
if (_shutdown.isShutdown())
@@ -161,10 +162,16 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
_asyncDispatches.increment();
}
+ boolean thrownError = false;
try
{
handler.handle(path, baseRequest, request, response);
}
+ catch (Throwable t)
+ {
+ thrownError = true;
+ throw t;
+ }
finally
{
final long now = System.currentTimeMillis();
@@ -184,7 +191,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
{
_requestStats.decrement();
_requestTimeStats.record(dispatched);
- updateResponse(baseRequest);
+ updateResponse(baseRequest, thrownError);
}
}
@@ -193,10 +200,14 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
}
}
- protected void updateResponse(Request request)
+ protected void updateResponse(Request request, boolean thrownError)
{
Response response = request.getResponse();
- if (request.isHandled())
+ if (thrownError)
+ {
+ _responsesThrown.increment();
+ }
+ else if (request.isHandled())
{
switch (response.getStatus() / 100)
{
@@ -532,6 +543,18 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
return _responses5xx.intValue();
}
+ /**
+ * @return the number of requests that threw an exception during handling
+ * since {@link #statsReset()} was last called. These may have resulted in
+ * some error responses which were unrecorded by the {@link StatisticsHandler}.
+ */
+ @ManagedAttribute("number of requests that threw an exception during handling")
+ public int getResponsesThrown()
+ {
+ return _responsesThrown.intValue();
+ }
+
+
/**
* @return the milliseconds since the statistics were started with {@link #statsReset()}.
*/
@@ -585,6 +608,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
sb.append("3xx responses: ").append(getResponses3xx()).append("
\n");
sb.append("4xx responses: ").append(getResponses4xx()).append("
\n");
sb.append("5xx responses: ").append(getResponses5xx()).append("
\n");
+ sb.append("responses thrown: ").append(getResponsesThrown()).append("
\n");
sb.append("Bytes sent total: ").append(getResponsesBytesTotal()).append("
\n");
return sb.toString();
diff --git a/jetty-ee9/jetty-ee9-openid/pom.xml b/jetty-ee9/jetty-ee9-openid/pom.xml
index f32ec93b6a6..45466cf034c 100644
--- a/jetty-ee9/jetty-ee9-openid/pom.xml
+++ b/jetty-ee9/jetty-ee9-openid/pom.xml
@@ -21,19 +21,12 @@
org.apache.felix
maven-bundle-plugin
true
-
-
-
- manifest
-
-
-
- osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"
- osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory
-
-
-
-
+
+
+ osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"
+ osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory
+
+
diff --git a/jetty-ee9/jetty-ee9-osgi/test-jetty-ee9-osgi/pom.xml b/jetty-ee9/jetty-ee9-osgi/test-jetty-ee9-osgi/pom.xml
index b5849de5ef7..3c7637f40ce 100644
--- a/jetty-ee9/jetty-ee9-osgi/test-jetty-ee9-osgi/pom.xml
+++ b/jetty-ee9/jetty-ee9-osgi/test-jetty-ee9-osgi/pom.xml
@@ -17,7 +17,7 @@
2.6.2
1.8.3
3.0.0
- 1.3.4
+ 1.3.5
diff --git a/jetty-ee9/jetty-ee9-osgi/test-jetty-ee9-osgi/src/test/java/org/eclipse/jetty/ee9/osgi/test/TestJettyOSGiBootHTTP2Conscrypt.java b/jetty-ee9/jetty-ee9-osgi/test-jetty-ee9-osgi/src/test/java/org/eclipse/jetty/ee9/osgi/test/TestJettyOSGiBootHTTP2Conscrypt.java
index d7e0255dcc3..f7f8ed3f912 100644
--- a/jetty-ee9/jetty-ee9-osgi/test-jetty-ee9-osgi/src/test/java/org/eclipse/jetty/ee9/osgi/test/TestJettyOSGiBootHTTP2Conscrypt.java
+++ b/jetty-ee9/jetty-ee9-osgi/test-jetty-ee9-osgi/src/test/java/org/eclipse/jetty/ee9/osgi/test/TestJettyOSGiBootHTTP2Conscrypt.java
@@ -45,7 +45,6 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.wrappedBundle;
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
@@ -89,12 +88,8 @@ public class TestJettyOSGiBootHTTP2Conscrypt
res.add(CoreOptions.systemProperty("jetty.alpn.protocols").value("h2,http/1.1"));
res.add(CoreOptions.systemProperty("jetty.sslContext.provider").value("Conscrypt"));
- res.add(wrappedBundle(mavenBundle().groupId("org.conscrypt").artifactId("conscrypt-openjdk-uber").versionAsInProject())
- .imports("javax.net.ssl,*")
- .exports("org.conscrypt;version=" + System.getProperty("conscrypt-version"))
- .instructions("Bundle-NativeCode=META-INF/native/libconscrypt_openjdk_jni-linux-x86_64.so")
- .start());
- res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-ee9-osgi-alpn").versionAsInProject().noStart());
+ res.add(mavenBundle().groupId("org.conscrypt").artifactId("conscrypt-openjdk-uber").versionAsInProject().start());
+ res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-osgi-alpn").versionAsInProject().noStart());
res.add(mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-conscrypt-server").versionAsInProject().start());
res.add(mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-server").versionAsInProject().start());
diff --git a/jetty-ee9/jetty-ee9-security/pom.xml b/jetty-ee9/jetty-ee9-security/pom.xml
index 91a61bb561a..f56b1b95562 100644
--- a/jetty-ee9/jetty-ee9-security/pom.xml
+++ b/jetty-ee9/jetty-ee9-security/pom.xml
@@ -21,18 +21,11 @@
org.apache.felix
maven-bundle-plugin
true
-
-
-
- manifest
-
-
-
- osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory)";resolution:=optional;cardinality:=multiple, osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional
-
-
-
-
+
+
+ osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory)";resolution:=optional;cardinality:=multiple, osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional
+
+
diff --git a/jetty-ee9/jetty-ee9-servlet/src/main/java/org/eclipse/jetty/ee9/servlet/DefaultServlet.java b/jetty-ee9/jetty-ee9-servlet/src/main/java/org/eclipse/jetty/ee9/servlet/DefaultServlet.java
index 8e7382c5516..7a477e0f1dd 100644
--- a/jetty-ee9/jetty-ee9-servlet/src/main/java/org/eclipse/jetty/ee9/servlet/DefaultServlet.java
+++ b/jetty-ee9/jetty-ee9-servlet/src/main/java/org/eclipse/jetty/ee9/servlet/DefaultServlet.java
@@ -16,6 +16,7 @@ package org.eclipse.jetty.ee9.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
import java.util.StringTokenizer;
import jakarta.servlet.ServletContext;
@@ -170,7 +171,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
_resourceService.setAcceptRanges(getInitBoolean("acceptRanges", _resourceService.isAcceptRanges()));
_resourceService.setDirAllowed(getInitBoolean("dirAllowed", _resourceService.isDirAllowed()));
_resourceService.setRedirectWelcome(getInitBoolean("redirectWelcome", _resourceService.isRedirectWelcome()));
- _resourceService.setPrecompressedFormats(parsePrecompressedFormats(getInitParameter("precompressed"), getInitBoolean("gzip", false)));
+ _resourceService.setPrecompressedFormats(parsePrecompressedFormats(getInitParameter("precompressed"), getInitBoolean("gzip"), _resourceService.getPrecompressedFormats()));
_resourceService.setPathInfoOnly(getInitBoolean("pathInfoOnly", _resourceService.isPathInfoOnly()));
_resourceService.setEtags(getInitBoolean("etags", _resourceService.isEtags()));
@@ -303,8 +304,12 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
LOG.debug("resource base = {}", _resourceBase);
}
- private CompressedContentFormat[] parsePrecompressedFormats(String precompressed, boolean gzip)
+ private CompressedContentFormat[] parsePrecompressedFormats(String precompressed, Boolean gzip, CompressedContentFormat[] dft)
{
+ if (precompressed == null && gzip == null)
+ {
+ return dft;
+ }
List ret = new ArrayList<>();
if (precompressed != null && precompressed.indexOf('=') > 0)
{
@@ -314,7 +319,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
String encoding = setting[0].trim();
String extension = setting[1].trim();
ret.add(new CompressedContentFormat(encoding, extension));
- if (gzip && !ret.contains(CompressedContentFormat.GZIP))
+ if (gzip == Boolean.TRUE && !ret.contains(CompressedContentFormat.GZIP))
ret.add(CompressedContentFormat.GZIP);
}
}
@@ -326,7 +331,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
ret.add(CompressedContentFormat.GZIP);
}
}
- else if (gzip)
+ else if (gzip == Boolean.TRUE)
{
// gzip handling is for backwards compatibility with older Jetty
ret.add(CompressedContentFormat.GZIP);
@@ -367,11 +372,11 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
return value;
}
- private boolean getInitBoolean(String name, boolean dft)
+ private Boolean getInitBoolean(String name)
{
String value = getInitParameter(name);
if (value == null || value.length() == 0)
- return dft;
+ return null;
return (value.startsWith("t") ||
value.startsWith("T") ||
value.startsWith("y") ||
@@ -379,6 +384,11 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
value.startsWith("1"));
}
+ private boolean getInitBoolean(String name, boolean dft)
+ {
+ return Optional.ofNullable(getInitBoolean(name)).orElse(dft);
+ }
+
private int getInitInt(String name, int dft)
{
String value = getInitParameter(name);
diff --git a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-client/pom.xml b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-client/pom.xml
index 3cc07355ccc..ab50c9a60f2 100644
--- a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-client/pom.xml
+++ b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-client/pom.xml
@@ -59,28 +59,21 @@
org.apache.felix
maven-bundle-plugin
true
-
-
-
- manifest
-
-
-
- jakarta.websocket.client Implementation
-
- org.eclipse.jetty.websocket.jakarta.client.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
-
-
- osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional
-
-
- osgi.serviceloader;osgi.serviceloader=jakarta.websocket.ContainerProvider,
- osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer
-
-
-
-
-
+
+
+ jakarta.websocket.client Implementation
+
+ org.eclipse.jetty.websocket.jakarta.client.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
+
+
+ osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional
+
+
+ osgi.serviceloader;osgi.serviceloader=jakarta.websocket.ContainerProvider,
+ osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer
+
+
+
diff --git a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-common/pom.xml b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-common/pom.xml
index 55fd8e9fdcd..135343d8b28 100644
--- a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-common/pom.xml
+++ b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-common/pom.xml
@@ -20,21 +20,14 @@
org.apache.felix
maven-bundle-plugin
true
-
-
-
- manifest
-
-
-
- jakarta.websocket.client Implementation
-
- org.eclipse.jetty.websocket.jakarta.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
-
-
-
-
-
+
+
+ jakarta.websocket.client Implementation
+
+ org.eclipse.jetty.websocket.jakarta.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
+
+
+
diff --git a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-server/pom.xml b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-server/pom.xml
index aa3f1d8ca94..6d040a4dc41 100644
--- a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-server/pom.xml
+++ b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-server/pom.xml
@@ -61,20 +61,18 @@
manifest
-
-
- jakarta.websocket.server Implementation
-
- org.eclipse.jetty.websocket.jakarta.server.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
-
- osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional
-
+
+
+ jakarta.websocket.server Implementation
+
+ org.eclipse.jetty.websocket.jakarta.server.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
+
+ osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional
+
osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.ee9.webapp.Configuration,osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer,osgi.serviceloader;osgi.serviceloader=jakarta.websocket.server.ServerEndpointConfig$Configurator
-
-
-
-
-
+
+
+
diff --git a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-tests/pom.xml b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-tests/pom.xml
index eddffce9c13..397a551e0a9 100644
--- a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-tests/pom.xml
+++ b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jakarta-tests/pom.xml
@@ -77,21 +77,14 @@
org.apache.felix
maven-bundle-plugin
true
-
-
-
- manifest
-
-
-
- jakarta.websocket Integration Tests
-
- org.eclipse.jetty.websocket.jakarta.tests.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
-
-
-
-
-
+
+
+ jakarta.websocket Integration Tests
+
+ org.eclipse.jetty.websocket.jakarta.tests.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
+
+
+
diff --git a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jetty-server/pom.xml b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jetty-server/pom.xml
index 60367a09906..ff80cf281db 100644
--- a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jetty-server/pom.xml
+++ b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jetty-server/pom.xml
@@ -64,9 +64,12 @@
Jetty Websocket Server
- osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional
+
+ osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional
+
- osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.ee9.webapp.Configuration,osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer
+ osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.ee9.webapp.Configuration,
+ osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer
diff --git a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jetty-tests/pom.xml b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jetty-tests/pom.xml
index 140cabad54c..36179334138 100644
--- a/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jetty-tests/pom.xml
+++ b/jetty-ee9/jetty-ee9-websocket/jetty-ee9-websocket-jetty-tests/pom.xml
@@ -98,21 +98,14 @@
org.apache.felix
maven-bundle-plugin
true
-
-
-
- manifest
-
-
-
- jetty.websocket Integration Tests
-
- org.eclipse.jetty.websocket.jetty.tests.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
-
-
-
-
-
+
+
+ jetty.websocket Integration Tests
+
+ org.eclipse.jetty.websocket.jetty.tests.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
+
+
+
org.apache.maven.plugins
diff --git a/jetty-integrations/jetty-gcloud/jetty-gcloud-session-manager/pom.xml b/jetty-integrations/jetty-gcloud/jetty-gcloud-session-manager/pom.xml
index 50d8ab9d1bf..a9dbef9036d 100644
--- a/jetty-integrations/jetty-gcloud/jetty-gcloud-session-manager/pom.xml
+++ b/jetty-integrations/jetty-gcloud/jetty-gcloud-session-manager/pom.xml
@@ -50,20 +50,13 @@
org.apache.felix
maven-bundle-plugin
true
-
-
-
- manifest
-
-
-
-
- org.eclipse.jetty.gcloud.session.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
-
-
-
-
-
+
+
+
+ org.eclipse.jetty.gcloud.session.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
+
+
+
org.apache.maven.plugins
diff --git a/jetty-p2/pom.xml b/jetty-p2/pom.xml
index 6d424442115..641d09cd77e 100644
--- a/jetty-p2/pom.xml
+++ b/jetty-p2/pom.xml
@@ -12,7 +12,7 @@
Generates a (maven based) P2 Updatesite
pom
- 2.5.0
+ 2.7.3
diff --git a/pom.xml b/pom.xml
index 48ce25573c2..fa239266612 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,31 +27,31 @@
4.5.13
4.4.15
2.5.3
- 2.2.1
- 9.2
- 4.1.1
- 5.3.0
+ 9.3
+ 4.2.0
+ 6.2.0
1.5
- 9.2.1
+ 10.2
1.15
3.12.0
2.5.2
3.4.2
7.0.3
3.0.2
- 2.10.0
- 1.43.1
- 2.8.9
- 31.0.1-jre
- 5.0.1
+ 2.13.1
+ 1.46.0
+ 2.9.0
+ 31.1-jre
+ 5.1.0
2.2
- 4.2.4
- 11.0.11.Final
- 4.3.4.Final
- 2.13.0
- 2.82
- 3.4.3.Final
- 2.2.1.Final
+ 2.14.5
+ 4.2.5
+ 4.4.3.Final
+ 11.0.15.Final
+ 2.13.2.2
+ 2.2.1.Final
+ 2.2.1.Final
+ 3.5.0.Final
2.1.18.Final
3.1.0.Final
1.1
@@ -70,18 +70,21 @@
2.4.7
10.0.10
5.8.2
- 2.0.1
- 2.17.1
- 1.3.0-alpha12
- 2.7.4
+ 2.0.2
+ 2.17.2
+ 1.3.0-alpha15
+ 3.0.4
10.3.6
3.8.4
0.13.1
- 1.7.3
- 3.2.2
+ 1.8.0
+ 3.8.4
+ 3.12.11
0.9.1
8.0.1
6.0.0
+ 1.2.0
+ 1.2.0
2.1.1
3.4.1
2.0.0-alpha6
@@ -753,7 +756,6 @@
org.apache.felix
maven-bundle-plugin
${maven.bundle.plugin.version}
- true
jar
@@ -1493,12 +1495,12 @@
org.jboss.logging
jboss-logging-annotations
- ${jboss-logging.version}
+ ${jboss.logging.annotations.version}
org.jboss.logging
jboss-logging-processor
- ${jboss-logging.version}
+ ${jboss.logging.processor.version}
org.jboss.logmanager
@@ -1539,14 +1541,31 @@
org.osgi
+
org.osgi.core
${org.osgi.core.version}
+
+ org.osgi
+
+ osgi.core
+ ${org.osgi.core.version}
+
org.osgi
osgi.annotation
${org.osgi.annotation.version}
+
+ org.osgi
+ org.osgi.util.function
+ ${org.osgi.util.function.version}
+
+
+ org.osgi
+ org.osgi.util.promise
+ ${org.osgi.util.promise.version}
+
org.ow2.asm
asm