diff --git a/handler/src/main/java/io/netty/handler/ssl/JdkAlpnApplicationProtocolNegotiator.java b/handler/src/main/java/io/netty/handler/ssl/JdkAlpnApplicationProtocolNegotiator.java
index 66536f4901..cd3fe15051 100644
--- a/handler/src/main/java/io/netty/handler/ssl/JdkAlpnApplicationProtocolNegotiator.java
+++ b/handler/src/main/java/io/netty/handler/ssl/JdkAlpnApplicationProtocolNegotiator.java
@@ -107,7 +107,7 @@ public final class JdkAlpnApplicationProtocolNegotiator extends JdkBaseApplicati
super(ALPN_WRAPPER, selectorFactory, listenerFactory, protocols);
}
- private static final class FailureWrapper implements SslEngineWrapperFactory {
+ private static final class FailureWrapper extends AllocatorAwareSslEngineWrapperFactory {
@Override
public SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc,
JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer) {
@@ -118,7 +118,7 @@ public final class JdkAlpnApplicationProtocolNegotiator extends JdkBaseApplicati
}
}
- private static final class AlpnWrapper implements SslEngineWrapperFactory {
+ private static final class AlpnWrapper extends AllocatorAwareSslEngineWrapperFactory {
@Override
public SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc,
JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer) {
diff --git a/handler/src/main/java/io/netty/handler/ssl/JdkApplicationProtocolNegotiator.java b/handler/src/main/java/io/netty/handler/ssl/JdkApplicationProtocolNegotiator.java
index c414517025..de8c492b04 100644
--- a/handler/src/main/java/io/netty/handler/ssl/JdkApplicationProtocolNegotiator.java
+++ b/handler/src/main/java/io/netty/handler/ssl/JdkApplicationProtocolNegotiator.java
@@ -28,6 +28,29 @@ public interface JdkApplicationProtocolNegotiator extends ApplicationProtocolNeg
* Abstract factory pattern for wrapping an {@link SSLEngine} object. This is useful for NPN/APLN JDK support.
*/
interface SslEngineWrapperFactory {
+ /**
+ * Abstract factory pattern for wrapping an {@link SSLEngine} object. This is useful for NPN/APLN support.
+ *
+ * @param engine The engine to wrap.
+ * @param applicationNegotiator The application level protocol negotiator
+ * @param isServer
+ * - {@code true} if the engine is for server side of connections
+ * - {@code false} if the engine is for client side of connections
+ *
+ * @return The resulting wrapped engine. This may just be {@code engine}.
+ */
+ SSLEngine wrapSslEngine(
+ SSLEngine engine, JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer);
+ }
+
+ abstract class AllocatorAwareSslEngineWrapperFactory implements SslEngineWrapperFactory {
+
+ @Override
+ public final SSLEngine wrapSslEngine(SSLEngine engine,
+ JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer) {
+ return wrapSslEngine(engine, ByteBufAllocator.DEFAULT, applicationNegotiator, isServer);
+ }
+
/**
* Abstract factory pattern for wrapping an {@link SSLEngine} object. This is useful for NPN/APLN support.
*
@@ -40,8 +63,8 @@ public interface JdkApplicationProtocolNegotiator extends ApplicationProtocolNeg
*
* @return The resulting wrapped engine. This may just be {@code engine}.
*/
- SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc,
- JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer);
+ abstract SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc,
+ JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer);
}
/**
diff --git a/handler/src/main/java/io/netty/handler/ssl/JdkDefaultApplicationProtocolNegotiator.java b/handler/src/main/java/io/netty/handler/ssl/JdkDefaultApplicationProtocolNegotiator.java
index 7c3e4d3c74..75e405260a 100644
--- a/handler/src/main/java/io/netty/handler/ssl/JdkDefaultApplicationProtocolNegotiator.java
+++ b/handler/src/main/java/io/netty/handler/ssl/JdkDefaultApplicationProtocolNegotiator.java
@@ -30,7 +30,7 @@ final class JdkDefaultApplicationProtocolNegotiator implements JdkApplicationPro
new JdkDefaultApplicationProtocolNegotiator();
private static final SslEngineWrapperFactory DEFAULT_SSL_ENGINE_WRAPPER_FACTORY = new SslEngineWrapperFactory() {
@Override
- public SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc,
+ public SSLEngine wrapSslEngine(SSLEngine engine,
JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer) {
return engine;
}
diff --git a/handler/src/main/java/io/netty/handler/ssl/JdkNpnApplicationProtocolNegotiator.java b/handler/src/main/java/io/netty/handler/ssl/JdkNpnApplicationProtocolNegotiator.java
index 70bd59d917..612627f0ec 100644
--- a/handler/src/main/java/io/netty/handler/ssl/JdkNpnApplicationProtocolNegotiator.java
+++ b/handler/src/main/java/io/netty/handler/ssl/JdkNpnApplicationProtocolNegotiator.java
@@ -31,7 +31,7 @@ public final class JdkNpnApplicationProtocolNegotiator extends JdkBaseApplicatio
}
@Override
- public SSLEngine wrapSslEngine(SSLEngine engine, ByteBufAllocator alloc,
+ public SSLEngine wrapSslEngine(SSLEngine engine,
JdkApplicationProtocolNegotiator applicationNegotiator, boolean isServer) {
return new JettyNpnSslEngine(engine, applicationNegotiator, isServer);
}
diff --git a/handler/src/main/java/io/netty/handler/ssl/JdkSslContext.java b/handler/src/main/java/io/netty/handler/ssl/JdkSslContext.java
index 9cf6f26b62..dc3b5dca48 100644
--- a/handler/src/main/java/io/netty/handler/ssl/JdkSslContext.java
+++ b/handler/src/main/java/io/netty/handler/ssl/JdkSslContext.java
@@ -236,7 +236,12 @@ public class JdkSslContext extends SslContext {
throw new Error("Unknown auth " + clientAuth);
}
}
- return apn.wrapperFactory().wrapSslEngine(engine, alloc, apn, isServer());
+ JdkApplicationProtocolNegotiator.SslEngineWrapperFactory factory = apn.wrapperFactory();
+ if (factory instanceof JdkApplicationProtocolNegotiator.AllocatorAwareSslEngineWrapperFactory) {
+ return ((JdkApplicationProtocolNegotiator.AllocatorAwareSslEngineWrapperFactory) factory)
+ .wrapSslEngine(engine, alloc, apn, isServer());
+ }
+ return factory.wrapSslEngine(engine, apn, isServer());
}
@Override