diff --git a/src/main/java/org/jboss/netty/handler/ssl/SslHandler.java b/src/main/java/org/jboss/netty/handler/ssl/SslHandler.java index 8d9fdfbe3b..b210672382 100644 --- a/src/main/java/org/jboss/netty/handler/ssl/SslHandler.java +++ b/src/main/java/org/jboss/netty/handler/ssl/SslHandler.java @@ -142,7 +142,7 @@ public class SslHandler extends FrameDecoder implements ChannelDownstreamHandler if (handshaking) { return this.handshakeFuture; } else { - handshakeFuture = this.handshakeFuture = future(channel); + handshakeFuture = this.handshakeFuture = newHandshakeFuture(channel); handshaking = true; } } @@ -504,7 +504,7 @@ public class SslHandler extends FrameDecoder implements ChannelDownstreamHandler handshaken = true; if (handshakeFuture != null) { - handshakeFuture = future(channel); + handshakeFuture = newHandshakeFuture(channel); } } handshakeFuture.setSuccess(); @@ -516,7 +516,7 @@ public class SslHandler extends FrameDecoder implements ChannelDownstreamHandler handshaken = false; if (handshakeFuture != null) { - handshakeFuture = future(channel); + handshakeFuture = newHandshakeFuture(channel); } } handshakeFuture.setFailure(cause); @@ -541,6 +541,19 @@ public class SslHandler extends FrameDecoder implements ChannelDownstreamHandler context.sendDownstream(e); } + private static ChannelFuture newHandshakeFuture(Channel channel) { + ChannelFuture future = future(channel); + future.addListener(new ChannelFutureListener() { + public void operationComplete(ChannelFuture future) + throws Exception { + if (!future.isSuccess()) { + fireExceptionCaught(future.getChannel(), future.getCause()); + } + } + }); + return future; + } + private static class PendingWrite { final ChannelFuture future; final ByteBuffer outAppBuf;