diff --git a/client/src/main/java/org/asynchttpclient/SslEngineFactory.java b/client/src/main/java/org/asynchttpclient/SslEngineFactory.java index 7fb25dd844..008f1c7ee8 100644 --- a/client/src/main/java/org/asynchttpclient/SslEngineFactory.java +++ b/client/src/main/java/org/asynchttpclient/SslEngineFactory.java @@ -39,4 +39,12 @@ public interface SslEngineFactory { default void init(AsyncHttpClientConfig config) throws SSLException { // no op } + + /** + * Perform any necessary cleanup. + */ + default void destroy() { + // no op + } + } diff --git a/client/src/main/java/org/asynchttpclient/netty/channel/ChannelManager.java b/client/src/main/java/org/asynchttpclient/netty/channel/ChannelManager.java index eaa7032e41..4488bb6514 100755 --- a/client/src/main/java/org/asynchttpclient/netty/channel/ChannelManager.java +++ b/client/src/main/java/org/asynchttpclient/netty/channel/ChannelManager.java @@ -18,6 +18,7 @@ import io.netty.channel.*; import io.netty.channel.epoll.EpollEventLoopGroup; import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.ChannelGroupFuture; import io.netty.channel.group.DefaultChannelGroup; import io.netty.channel.kqueue.KQueueEventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; @@ -287,8 +288,9 @@ public void removeAll(Channel connection) { } private void doClose() { - openChannels.close(); + ChannelGroupFuture groupFuture = openChannels.close(); channelPool.destroy(); + groupFuture.addListener(future -> sslEngineFactory.destroy()); } public void close() { diff --git a/client/src/main/java/org/asynchttpclient/netty/ssl/DefaultSslEngineFactory.java b/client/src/main/java/org/asynchttpclient/netty/ssl/DefaultSslEngineFactory.java index 60b14b56e5..401c60a581 100644 --- a/client/src/main/java/org/asynchttpclient/netty/ssl/DefaultSslEngineFactory.java +++ b/client/src/main/java/org/asynchttpclient/netty/ssl/DefaultSslEngineFactory.java @@ -19,6 +19,7 @@ import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.SslProvider; import io.netty.handler.ssl.util.InsecureTrustManagerFactory; +import io.netty.util.ReferenceCountUtil; import org.asynchttpclient.AsyncHttpClientConfig; import javax.net.ssl.SSLEngine; @@ -73,6 +74,11 @@ public void init(AsyncHttpClientConfig config) throws SSLException { sslContext = buildSslContext(config); } + @Override + public void destroy() { + ReferenceCountUtil.release(sslContext); + } + /** * The last step of configuring the SslContextBuilder used to create an SslContext when no context is provided in the {@link AsyncHttpClientConfig}. This defaults to no-op and * is intended to be overridden as needed.