You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2020/05/08 19:30:29 UTC
[tomcat] branch 8.5.x updated: Add support for ALPN on Java 8
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 <re...@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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org