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 + * @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