From e6e4e46b204a61fa3ae518d07f27f1fd0e59496e Mon Sep 17 00:00:00 2001 From: Thierry Boileau Date: Sun, 18 Oct 2026 17:09:23 +0200 Subject: [PATCH 1/2] Upgraded Jetty library to version 12.1.14. Issue #1515. --- changes.md | 2 + org.restlet/pom.xml | 10 +++++ .../engine/connector/HttpClientHelper.java | 41 +++++++++++-------- .../engine/connector/HttpsServerHelper.java | 33 ++++++++------- pom.xml | 2 +- 5 files changed, 54 insertions(+), 34 deletions(-) diff --git a/changes.md b/changes.md index eeebb23d14..64e8191859 100644 --- a/changes.md +++ b/changes.md @@ -2,6 +2,8 @@ Changes log =========== - 2.7.1 (??-??-2026) + - Misc + - Upgraded Jetty library to version 12.1.14. Issue #1515. - Bugs fixed - Slf4j bridge reports wrong line number and caller class in log4j. Issue #233. - When GET is an allowed method of a server resource, HEAD is now also listed (e.g. in the Allow header of a 405 response). Issue #266. diff --git a/org.restlet/pom.xml b/org.restlet/pom.xml index 2afe4f5cce..21911ec1f5 100644 --- a/org.restlet/pom.xml +++ b/org.restlet/pom.xml @@ -45,6 +45,11 @@ jetty-quic-server ${lib-jetty-version} + + org.eclipse.jetty.quic + jetty-quic-quiche-server + ${lib-jetty-version} + org.eclipse.jetty jetty-client @@ -95,6 +100,11 @@ jetty-quic-client ${lib-jetty-version} + + org.eclipse.jetty.quic + jetty-quic-quiche-client + ${lib-jetty-version} + org.osgi org.osgi.core diff --git a/org.restlet/src/main/java/org/restlet/engine/connector/HttpClientHelper.java b/org.restlet/src/main/java/org/restlet/engine/connector/HttpClientHelper.java index ae03874126..69ed92eed7 100644 --- a/org.restlet/src/main/java/org/restlet/engine/connector/HttpClientHelper.java +++ b/org.restlet/src/main/java/org/restlet/engine/connector/HttpClientHelper.java @@ -30,11 +30,13 @@ import org.eclipse.jetty.http2.client.transport.ClientConnectionFactoryOverHTTP2; import org.eclipse.jetty.http2.client.transport.HttpClientTransportOverHTTP2; import org.eclipse.jetty.http3.client.HTTP3Client; +import org.eclipse.jetty.http3.client.HTTP3ClientQuicConfiguration; import org.eclipse.jetty.http3.client.transport.ClientConnectionFactoryOverHTTP3; import org.eclipse.jetty.http3.client.transport.HttpClientTransportOverHTTP3; import org.eclipse.jetty.io.ClientConnectionFactory; import org.eclipse.jetty.io.ClientConnector; -import org.eclipse.jetty.quic.client.ClientQuicConfiguration; +import org.eclipse.jetty.quic.quiche.client.QuicheClientQuicConfiguration; +import org.eclipse.jetty.quic.quiche.client.QuicheTransport; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler; @@ -280,8 +282,8 @@ protected HttpClient createHttpClient() { switch (httpTransportProtocol) { case HTTP1_1 -> getHttpTransportForHttp11(); case HTTP2 -> getHttpClientTransportForHttp2(); - case HTTP3 -> getHttpClientTransportForHttp3(sslContextFactory); - case DYNAMIC -> getHttpClientTransportForDynamicMode(sslContextFactory); + case HTTP3 -> getHttpClientTransportForHttp3(); + case DYNAMIC -> getHttpClientTransportForDynamicMode(); }; final HttpClient result = new HttpClient(httpTransport); @@ -347,25 +349,28 @@ private static HttpClientTransportOverHTTP getHttpTransportForHttp11() { private HttpClientTransport getHttpClientTransportForHttp2() { HTTP2Client http2Client = new HTTP2Client(); - HttpClientTransportOverHTTP2 http2Transport = new HttpClientTransportOverHTTP2(http2Client); - http2Transport.setUseALPN(true); + http2Client.setUseALPN(true); - return http2Transport; + return new HttpClientTransportOverHTTP2(http2Client); } - private HttpClientTransport getHttpClientTransportForHttp3( - SslContextFactory.Client sslContextFactory) { - Path pemWorkDirectory = getHttp3PemWorkDirectoryPath(); - ClientQuicConfiguration quicConfiguration = - new ClientQuicConfiguration(sslContextFactory, pemWorkDirectory); + private HttpClientTransport getHttpClientTransportForHttp3() { + QuicheClientQuicConfiguration quicConfiguration = createQuicConfiguration(); HTTP3Client http3Client = new HTTP3Client(quicConfiguration); - http3Client.getQuicConfiguration().setSessionRecvWindow(64 * 1024 * 1024); - return new HttpClientTransportOverHTTP3(http3Client); + return new HttpClientTransportOverHTTP3( + http3Client, new QuicheTransport(quicConfiguration)); } - private HttpClientTransport getHttpClientTransportForDynamicMode( - SslContextFactory.Client sslContextFactory) { + private QuicheClientQuicConfiguration createQuicConfiguration() { + QuicheClientQuicConfiguration quicConfiguration = + HTTP3ClientQuicConfiguration.configure( + new QuicheClientQuicConfiguration(getHttp3PemWorkDirectoryPath())); + quicConfiguration.setSessionMaxData(64 * 1024 * 1024); + return quicConfiguration; + } + + private HttpClientTransport getHttpClientTransportForDynamicMode() { ClientConnectionFactory.Info http1 = HttpClientConnectionFactory.HTTP11; @@ -373,11 +378,11 @@ private HttpClientTransport getHttpClientTransportForDynamicMode( ClientConnectionFactoryOverHTTP2.HTTP2 http2 = new ClientConnectionFactoryOverHTTP2.HTTP2(http2Client); - ClientQuicConfiguration quicConfiguration = - new ClientQuicConfiguration(sslContextFactory, getHttp3PemWorkDirectoryPath()); + QuicheClientQuicConfiguration quicConfiguration = createQuicConfiguration(); HTTP3Client http3Client = new HTTP3Client(quicConfiguration); ClientConnectionFactoryOverHTTP3.HTTP3 http3 = - new ClientConnectionFactoryOverHTTP3.HTTP3(http3Client); + new ClientConnectionFactoryOverHTTP3.HTTP3( + http3Client, new QuicheTransport(quicConfiguration)); return new HttpClientTransportDynamic(new ClientConnector(), http1, http2, http3); } diff --git a/org.restlet/src/main/java/org/restlet/engine/connector/HttpsServerHelper.java b/org.restlet/src/main/java/org/restlet/engine/connector/HttpsServerHelper.java index 4580fc8d61..c2caded144 100644 --- a/org.restlet/src/main/java/org/restlet/engine/connector/HttpsServerHelper.java +++ b/org.restlet/src/main/java/org/restlet/engine/connector/HttpsServerHelper.java @@ -17,8 +17,9 @@ import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory; import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory; import org.eclipse.jetty.http3.server.HTTP3ServerConnectionFactory; -import org.eclipse.jetty.quic.server.QuicServerConnector; -import org.eclipse.jetty.quic.server.ServerQuicConfiguration; +import org.eclipse.jetty.http3.server.HTTP3ServerQuicConfiguration; +import org.eclipse.jetty.quic.quiche.server.QuicheServerConnector; +import org.eclipse.jetty.quic.quiche.server.QuicheServerQuicConfiguration; import org.eclipse.jetty.server.AbstractConnectionFactory; import org.eclipse.jetty.server.ConnectionFactory; import org.eclipse.jetty.server.Connector; @@ -97,9 +98,8 @@ protected List createConnectors(org.eclipse.jetty.server.Server serve ServerConnector connector = createServerConnector(server, configuration); result.add(connector); } else if (httpTransportProtocols.contains(HttpTransportProtocol.HTTP3)) { - ServerQuicConfiguration configuration = - createQuicConfiguration(getQuicServerSslContextFactory()); - QuicServerConnector connector = createQuicServerConnector(server, configuration); + QuicheServerConnector connector = + createQuicServerConnector(server, createHttpConfiguration()); result.add(connector); } @@ -144,11 +144,15 @@ protected ConnectionFactory[] createConnectionFactories(final HttpConfiguration sslContextFactory, connectionFactories.toArray(new ConnectionFactory[0])); } - private QuicServerConnector createQuicServerConnector( - org.eclipse.jetty.server.Server server, ServerQuicConfiguration configuration) { - QuicServerConnector connector = - new QuicServerConnector( - server, configuration, new HTTP3ServerConnectionFactory(configuration)); + private QuicheServerConnector createQuicServerConnector( + org.eclipse.jetty.server.Server server, HttpConfiguration httpConfiguration) { + QuicheServerQuicConfiguration quicConfiguration = createQuicConfiguration(); + QuicheServerConnector connector = + new QuicheServerConnector( + server, + getQuicServerSslContextFactory(), + quicConfiguration, + new HTTP3ServerConnectionFactory(httpConfiguration)); final String address = getHelped().getAddress(); if (address != null) { connector.setHost(address); @@ -243,11 +247,10 @@ private SslContextFactory.Server getQuicServerSslContextFactory() { return sslContextFactory; } - private ServerQuicConfiguration createQuicConfiguration( - SslContextFactory.Server sslContextFactory) { - Path pemWorkDirectory = getHttp3PemWorkDirectoryPath(); - ServerQuicConfiguration configuration = - new ServerQuicConfiguration(sslContextFactory, pemWorkDirectory); + private QuicheServerQuicConfiguration createQuicConfiguration() { + QuicheServerQuicConfiguration configuration = + HTTP3ServerQuicConfiguration.configure( + new QuicheServerQuicConfiguration(getHttp3PemWorkDirectoryPath())); configuration.setOutputBufferSize(getHttpOutputBufferSize()); return configuration; } diff --git a/pom.xml b/pom.xml index 391344d58b..6a73900d0f 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ 2.22.3 2.22 2.14.2 - 12.0.39 + 12.1.14 20260522 1.2.17 1.3 From 92b4b134a19a60ea8923d88dae23645d31bc2c64 Mon Sep 17 00:00:00 2001 From: Thierry Boileau Date: Sun, 18 Oct 2026 17:23:06 +0200 Subject: [PATCH 2/2] Fixed Sonar warning --- .../restlet/engine/connector/HttpClientHelper.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/org.restlet/src/main/java/org/restlet/engine/connector/HttpClientHelper.java b/org.restlet/src/main/java/org/restlet/engine/connector/HttpClientHelper.java index 69ed92eed7..62efb70208 100644 --- a/org.restlet/src/main/java/org/restlet/engine/connector/HttpClientHelper.java +++ b/org.restlet/src/main/java/org/restlet/engine/connector/HttpClientHelper.java @@ -238,8 +238,9 @@ public HttpClientHelper(Client client) { getProtocols().add(Protocol.HTTP); getProtocols().add(Protocol.HTTPS); this.authenticationStore = null; - this.cookieStore = - isCookieSupported() ? new HttpCookieStore.Default() : new HttpCookieStore.Empty(); + this.cookieStore = isCookieSupported() + ? new HttpCookieStore.Default() + : new HttpCookieStore.Empty(); this.executor = null; } @@ -250,15 +251,10 @@ public HttpClientHelper(Client client) { * @return A low-level HTTP client call. */ public ClientCall create(Request request) { - ClientCall result = null; - - result = - new JettyClientCall( + return new JettyClientCall( this, request.getMethod().toString(), ReferenceUtils.update(request.getResourceRef(), request).toString()); - - return result; } /** @@ -366,7 +362,7 @@ private QuicheClientQuicConfiguration createQuicConfiguration() { QuicheClientQuicConfiguration quicConfiguration = HTTP3ClientQuicConfiguration.configure( new QuicheClientQuicConfiguration(getHttp3PemWorkDirectoryPath())); - quicConfiguration.setSessionMaxData(64 * 1024 * 1024); + quicConfiguration.setSessionMaxData(64 * 1024L * 1024L); return quicConfiguration; }