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..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
@@ -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;
@@ -236,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;
}
@@ -248,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;
}
/**
@@ -280,8 +278,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 +345,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 QuicheClientQuicConfiguration createQuicConfiguration() {
+ QuicheClientQuicConfiguration quicConfiguration =
+ HTTP3ClientQuicConfiguration.configure(
+ new QuicheClientQuicConfiguration(getHttp3PemWorkDirectoryPath()));
+ quicConfiguration.setSessionMaxData(64 * 1024L * 1024L);
+ return quicConfiguration;
}
- private HttpClientTransport getHttpClientTransportForDynamicMode(
- SslContextFactory.Client sslContextFactory) {
+ private HttpClientTransport getHttpClientTransportForDynamicMode() {
ClientConnectionFactory.Info http1 = HttpClientConnectionFactory.HTTP11;
@@ -373,11 +374,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