diff --git a/handler/src/main/java/io/netty/handler/ssl/SslHandler.java b/handler/src/main/java/io/netty/handler/ssl/SslHandler.java index 60e21e7a44..d845348d84 100644 --- a/handler/src/main/java/io/netty/handler/ssl/SslHandler.java +++ b/handler/src/main/java/io/netty/handler/ssl/SslHandler.java @@ -406,16 +406,15 @@ public class SslHandler } private void flush0(ChannelHandlerContext ctx) throws SSLException { - boolean unwrapLater = false; - PendingWrite pending = null; ByteBuf out = null; + ChannelPromise promise = null; try { for (;;) { if (out == null) { out = ctx.alloc().buffer(); } - pending = pendingUnencryptedWrites.peek(); + PendingWrite pending = pendingUnencryptedWrites.peek(); if (pending == null) { break; } @@ -423,7 +422,10 @@ public class SslHandler if (!pending.buf.isReadable()) { pending.buf.release(); + promise = pending.promise; pendingUnencryptedWrites.remove(); + } else { + promise = null; } if (result.getStatus() == Status.CLOSED) { @@ -445,8 +447,9 @@ public class SslHandler } else { switch (result.getHandshakeStatus()) { case NEED_WRAP: - if (!pending.buf.isReadable()) { - ctx.write(out, pending.promise); + if (promise != null) { + ctx.write(out, promise); + promise = null; } else { ctx.write(out); } @@ -488,14 +491,14 @@ public class SslHandler throw e; } finally { if (out != null && out.isReadable()) { - if (pending != null && !pending.buf.isReadable()) { - ctx.write(out, pending.promise); + if (promise != null) { + ctx.write(out, promise); } else { ctx.write(out); } out = null; - } else if (pending != null && !pending.buf.isReadable()) { - pending.promise.setSuccess(); + } else if (promise != null) { + promise.trySuccess(); } if (out != null) { out.release(); diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/SocketSslEchoTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/SocketSslEchoTest.java index 25d2c17da7..f2e64d16c1 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/SocketSslEchoTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/SocketSslEchoTest.java @@ -20,6 +20,7 @@ import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; import io.netty.channel.SimpleChannelInboundHandler; @@ -109,7 +110,11 @@ public class SocketSslEchoTest extends AbstractSocketTest { for (int i = FIRST_MESSAGE_SIZE; i < data.length;) { int length = Math.min(random.nextInt(1024 * 64), data.length - i); - cc.write(Unpooled.wrappedBuffer(data, i, length)); + ChannelFuture future = cc.write(Unpooled.wrappedBuffer(data, i, length)); + // TODO: Remove me as it seems like ChunkWriteHandler has a bug which let it hang here + if (!chunkWriteHandler) { + future.sync(); + } i += length; }