This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch 8.5.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/8.5.x by this push: new 4437049 Add support for ALPN on Java 8 4437049 is described below commit 44370498e2b8a147d80a761747506bed405a75d6 Author: remm <r...@apache.org> AuthorDate: Fri May 8 18:36:10 2020 +0200 Add support for ALPN on Java 8 HTTP/2 with a browser does work for me now. --- java/org/apache/tomcat/util/compat/Jre8Compat.java | 48 ++++++++++++++++++++++ java/org/apache/tomcat/util/compat/Jre9Compat.java | 31 -------------- java/org/apache/tomcat/util/compat/JreCompat.java | 5 +++ .../tomcat/util/net/AbstractJsseEndpoint.java | 2 +- .../apache/tomcat/util/net/SecureNio2Channel.java | 2 +- .../apache/tomcat/util/net/SecureNioChannel.java | 2 +- .../tomcat/util/net/jsse/JSSEImplementation.java | 2 +- webapps/docs/changelog.xml | 7 ++++ 8 files changed, 64 insertions(+), 35 deletions(-) diff --git a/java/org/apache/tomcat/util/compat/Jre8Compat.java b/java/org/apache/tomcat/util/compat/Jre8Compat.java index dfc2c87..78f59f3 100644 --- a/java/org/apache/tomcat/util/compat/Jre8Compat.java +++ b/java/org/apache/tomcat/util/compat/Jre8Compat.java @@ -24,6 +24,7 @@ import java.security.KeyStore.LoadStoreParameter; import java.util.Collections; import java.util.Map; +import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLParameters; import org.apache.juli.logging.Log; @@ -40,6 +41,9 @@ class Jre8Compat extends JreCompat { private static final Method setUseCipherSuitesOrderMethod; private static final Constructor<?> domainLoadStoreParameterConstructor; + protected static final Method setApplicationProtocolsMethod; + protected static final Method getApplicationProtocolMethod; + static { Method m1 = null; @@ -71,6 +75,16 @@ class Jre8Compat extends JreCompat { } setUseCipherSuitesOrderMethod = m1; domainLoadStoreParameterConstructor = c2; + Method m2 = null; + Method m3 = null; + try { + m2 = SSLParameters.class.getMethod("setApplicationProtocols", String[].class); + m3 = SSLEngine.class.getMethod("getApplicationProtocol"); + } catch (ReflectiveOperationException | IllegalArgumentException e) { + // Only the newest Java 8 have the ALPN API, so ignore + } + setApplicationProtocolsMethod = m2; + getApplicationProtocolMethod = m3; } @@ -111,4 +125,38 @@ class Jre8Compat extends JreCompat { public int jarFileRuntimeMajorVersion() { return RUNTIME_MAJOR_VERSION; } + + @Override + public void setApplicationProtocols(SSLParameters sslParameters, String[] protocols) { + if (setApplicationProtocolsMethod != null) { + try { + setApplicationProtocolsMethod.invoke(sslParameters, (Object) protocols); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new UnsupportedOperationException(e); + } + } else { + super.setApplicationProtocols(sslParameters, protocols); + } + } + + + @Override + public String getApplicationProtocol(SSLEngine sslEngine) { + if (getApplicationProtocolMethod != null) { + try { + return (String) getApplicationProtocolMethod.invoke(sslEngine); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + throw new UnsupportedOperationException(e); + } + } else { + return super.getApplicationProtocol(sslEngine); + } + } + + + public static boolean isAlpnSupported() { + return setApplicationProtocolsMethod != null && getApplicationProtocolMethod != null; + } + + } diff --git a/java/org/apache/tomcat/util/compat/Jre9Compat.java b/java/org/apache/tomcat/util/compat/Jre9Compat.java index 11c873e..f551ca6 100644 --- a/java/org/apache/tomcat/util/compat/Jre9Compat.java +++ b/java/org/apache/tomcat/util/compat/Jre9Compat.java @@ -31,9 +31,6 @@ import java.util.Set; import java.util.jar.JarFile; import java.util.zip.ZipFile; -import javax.net.ssl.SSLEngine; -import javax.net.ssl.SSLParameters; - import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.res.StringManager; @@ -44,8 +41,6 @@ class Jre9Compat extends Jre8Compat { private static final StringManager sm = StringManager.getManager(Jre9Compat.class); private static final Class<?> inaccessibleObjectExceptionClazz; - private static final Method setApplicationProtocolsMethod; - private static final Method getApplicationProtocolMethod; private static final Method setDefaultUseCachesMethod; private static final Method bootMethod; private static final Method configurationMethod; @@ -64,8 +59,6 @@ class Jre9Compat extends Jre8Compat { static { Class<?> c1 = null; - Method m2 = null; - Method m3 = null; Method m4 = null; Method m5 = null; Method m6 = null; @@ -96,8 +89,6 @@ class Jre9Compat extends Jre8Compat { Method runtimeVersionMethod = JarFile.class.getMethod("runtimeVersion"); Method majorMethod = versionClazz.getMethod("major"); - m2 = SSLParameters.class.getMethod("setApplicationProtocols", String[].class); - m3 = SSLEngine.class.getMethod("getApplicationProtocol"); m4 = URLConnection.class.getMethod("setDefaultUseCaches", String.class, boolean.class); m5 = moduleLayerClazz.getMethod("boot"); m6 = moduleLayerClazz.getMethod("configuration"); @@ -129,8 +120,6 @@ class Jre9Compat extends Jre8Compat { } inaccessibleObjectExceptionClazz = c1; - setApplicationProtocolsMethod = m2; - getApplicationProtocolMethod = m3; setDefaultUseCachesMethod = m4; bootMethod = m5; configurationMethod = m6; @@ -172,26 +161,6 @@ class Jre9Compat extends Jre8Compat { @Override - public void setApplicationProtocols(SSLParameters sslParameters, String[] protocols) { - try { - setApplicationProtocolsMethod.invoke(sslParameters, (Object) protocols); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - throw new UnsupportedOperationException(e); - } - } - - - @Override - public String getApplicationProtocol(SSLEngine sslEngine) { - try { - return (String) getApplicationProtocolMethod.invoke(sslEngine); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - throw new UnsupportedOperationException(e); - } - } - - - @Override public void disableCachingForJarUrlConnections() throws IOException { try { setDefaultUseCachesMethod.invoke(null, "JAR", Boolean.FALSE); diff --git a/java/org/apache/tomcat/util/compat/JreCompat.java b/java/org/apache/tomcat/util/compat/JreCompat.java index 814dfae..5cb26d2 100644 --- a/java/org/apache/tomcat/util/compat/JreCompat.java +++ b/java/org/apache/tomcat/util/compat/JreCompat.java @@ -94,6 +94,11 @@ public class JreCompat { // Java 7 implementation of Java 9 methods + public static boolean isAlpnSupported() { + return isJre9Available() || (isJre8Available() && Jre8Compat.isAlpnSupported()); + } + + public static boolean isJre9Available() { return jre9Available; } diff --git a/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java b/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java index 180dd8f..16ce41e 100644 --- a/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java +++ b/java/org/apache/tomcat/util/net/AbstractJsseEndpoint.java @@ -129,7 +129,7 @@ public abstract class AbstractJsseEndpoint<S> extends AbstractEndpoint<S> { JreCompat.getInstance().setUseServerCipherSuitesOrder(sslParameters, honorCipherOrder); } - if (JreCompat.isJre9Available() && clientRequestedApplicationProtocols != null + if (JreCompat.isAlpnSupported() && clientRequestedApplicationProtocols != null && clientRequestedApplicationProtocols.size() > 0 && negotiableProtocols.size() > 0) { // Only try to negotiate if both client and server have at least diff --git a/java/org/apache/tomcat/util/net/SecureNio2Channel.java b/java/org/apache/tomcat/util/net/SecureNio2Channel.java index 9f71e0a..8899da4 100644 --- a/java/org/apache/tomcat/util/net/SecureNio2Channel.java +++ b/java/org/apache/tomcat/util/net/SecureNio2Channel.java @@ -245,7 +245,7 @@ public class SecureNio2Channel extends Nio2Channel { if (sslEngine instanceof SSLUtil.ProtocolInfo) { socket.setNegotiatedProtocol( ((SSLUtil.ProtocolInfo) sslEngine).getNegotiatedProtocol()); - } else if (JreCompat.isJre9Available()) { + } else if (JreCompat.isAlpnSupported()) { socket.setNegotiatedProtocol( JreCompat.getInstance().getApplicationProtocol(sslEngine)); } diff --git a/java/org/apache/tomcat/util/net/SecureNioChannel.java b/java/org/apache/tomcat/util/net/SecureNioChannel.java index 483d076..5f59899 100644 --- a/java/org/apache/tomcat/util/net/SecureNioChannel.java +++ b/java/org/apache/tomcat/util/net/SecureNioChannel.java @@ -194,7 +194,7 @@ public class SecureNioChannel extends NioChannel { if (sslEngine instanceof SSLUtil.ProtocolInfo) { socketWrapper.setNegotiatedProtocol( ((SSLUtil.ProtocolInfo) sslEngine).getNegotiatedProtocol()); - } else if (JreCompat.isJre9Available()) { + } else if (JreCompat.isAlpnSupported()) { socketWrapper.setNegotiatedProtocol( JreCompat.getInstance().getApplicationProtocol(sslEngine)); } diff --git a/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java b/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java index 561dc3d..1c1eae8 100644 --- a/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java +++ b/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java @@ -52,6 +52,6 @@ public class JSSEImplementation extends SSLImplementation { @Override public boolean isAlpnSupported() { - return JreCompat.isJre9Available(); + return JreCompat.isAlpnSupported(); } } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index f61e511..37c99ee 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -45,6 +45,13 @@ issues do not "pop up" wrt. others). --> <section name="Tomcat 8.5.56 (markt)" rtext="in development"> + <subsection name="Coyote"> + <changelog> + <update> + Add support for ALPN on recent OpenJDK 8 releases. (remm) + </update> + </changelog> + </subsection> </section> <section name="Tomcat 8.5.55 (markt)" rtext="release in progress"> <subsection name="Catalina"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org