diff --git a/src/main/java/com/rabbitmq/client/impl/nio/SslEngineFrameBuilder.java b/src/main/java/com/rabbitmq/client/impl/nio/SslEngineFrameBuilder.java index c2f1923874..e96b2d7e8c 100644 --- a/src/main/java/com/rabbitmq/client/impl/nio/SslEngineFrameBuilder.java +++ b/src/main/java/com/rabbitmq/client/impl/nio/SslEngineFrameBuilder.java @@ -32,6 +32,8 @@ public class SslEngineFrameBuilder extends FrameBuilder { private final ByteBuffer cipherBuffer; + private boolean needToReadMore = false; + public SslEngineFrameBuilder(SSLEngine sslEngine, ByteBuffer plainIn, ByteBuffer cipherIn, ReadableByteChannel channel) { super(channel, plainIn); this.sslEngine = sslEngine; @@ -40,11 +42,21 @@ public SslEngineFrameBuilder(SSLEngine sslEngine, ByteBuffer plainIn, ByteBuffer @Override protected boolean somethingToRead() throws IOException { - if (applicationBuffer.hasRemaining()) { + if (applicationBuffer.hasRemaining() && !needToReadMore) { return true; } else { applicationBuffer.clear(); + if (needToReadMore) { + int read = NioHelper.read(channel, cipherBuffer); + if (read == 0) { + return false; + } else { + this.needToReadMore = false; + this.cipherBuffer.flip(); + } + } + while (true) { SSLEngineResult result = sslEngine.unwrap(cipherBuffer, applicationBuffer); switch (result.getStatus()) { @@ -61,6 +73,7 @@ protected boolean somethingToRead() throws IOException { cipherBuffer.compact(); int read = NioHelper.read(channel, cipherBuffer); if (read == 0) { + this.needToReadMore = true; return false; } cipherBuffer.flip();