From 2e42586bc59bf89e066a1d68ffa790bbfe28bb4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Thu, 13 Nov 2025 08:43:53 +0100 Subject: [PATCH] Only use HTTP/2 on certain java versions Currently we use HTTP/2 as a default but this produces problems with GOAWAY from servers breaking the download on some buggy JDKs. For now we disable HTTP/2 on these unsave versions and only enable it for those where the bug is fixed. --- .../httpclientjava/ECFHttpClientFactory.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclientjava/src/org/eclipse/ecf/internal/provider/filetransfer/httpclientjava/ECFHttpClientFactory.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclientjava/src/org/eclipse/ecf/internal/provider/filetransfer/httpclientjava/ECFHttpClientFactory.java index 7a60e6783..9d578e539 100644 --- a/providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclientjava/src/org/eclipse/ecf/internal/provider/filetransfer/httpclientjava/ECFHttpClientFactory.java +++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclientjava/src/org/eclipse/ecf/internal/provider/filetransfer/httpclientjava/ECFHttpClientFactory.java @@ -16,6 +16,7 @@ import java.net.Authenticator; import java.net.http.HttpClient; import java.net.http.HttpClient.Redirect; +import java.net.http.HttpClient.Version; import java.net.http.HttpRequest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; @@ -37,6 +38,8 @@ @SuppressWarnings({ "restriction" }) @Component public class ECFHttpClientFactory implements IHttpClientFactory { + private static final Runtime.Version JDK_BUG_8335181_JAVA21 = Runtime.Version.parse("21.0.8"); + private static final Runtime.Version JDK_BUG_8335181_JAVA17 = Runtime.Version.parse("17.0.17"); @SuppressWarnings("unused") private static final List DEFAULT_PREFERRED_AUTH_SCHEMES_NO_NTLM = Arrays.asList("Basic","Digest"); @SuppressWarnings("unused") @@ -51,7 +54,7 @@ public class ECFHttpClientFactory implements IHttpClientFactory { @Override public HttpClient.Builder newClient() { - HttpClient.Builder builder = HttpClient.newBuilder().followRedirects(Redirect.NORMAL); + HttpClient.Builder builder = HttpClient.newBuilder().version(getDefaultHttpVersion()).followRedirects(Redirect.NORMAL); String sslContextProvider = HttpClientOptions.HTTPCLIENT_SSLCONTEXT_PROVIDER; String sslContextProtocol = HttpClientOptions.HTTPCLIENT_SSLCONTEXT_PROTOCOL; SSLContextFactory sslContextFactory = Activator.getDefault().getSSLContextFactory(); @@ -82,6 +85,24 @@ public HttpClient.Builder run(IHttpClientModifier modifier, HttpClient.Builder v return builder; } + private Version getDefaultHttpVersion() { + // See https://bugs.openjdk.org/browse/JDK-8335181 + // Version with this bug are prone to spurious GOAWAY + // So we check here if it is safe to use HTTP/2 + var version = Runtime.version(); + int feature = version.feature(); + if (feature >= 25) { + return Version.HTTP_2; + } + if (feature == 17 && version.compareTo(JDK_BUG_8335181_JAVA17) >= 0) { + return Version.HTTP_2; + } + if (feature == 21 && version.compareTo(JDK_BUG_8335181_JAVA21) >= 0) { + return Version.HTTP_2; + } + return Version.HTTP_1_1; + } + @Override public IHttpClientContext newClientContext() { IHttpClientContext context = new IHttpClientContext() {