in httpcore5/src/main/java/org/apache/hc/core5/reactor/ssl/SSLIOSession.java [598:644]
private void decryptData(final IOSession protocolSession) throws IOException {
final HandshakeStatus handshakeStatus = sslEngine.getHandshakeStatus();
if ((handshakeStatus == HandshakeStatus.NOT_HANDSHAKING || handshakeStatus == HandshakeStatus.FINISHED)
&& inEncrypted.hasData()) {
final ByteBuffer inEncryptedBuf = inEncrypted.acquire();
inEncryptedBuf.flip();
try {
while (inEncryptedBuf.hasRemaining()) {
final ByteBuffer inPlainBuf = inPlain.acquire();
try {
final SSLEngineResult result = doUnwrap(inEncryptedBuf, inPlainBuf);
if (!inEncryptedBuf.hasRemaining() && result.getHandshakeStatus() == HandshakeStatus.NEED_UNWRAP) {
throw new SSLException("Unable to complete SSL handshake");
}
if (sslEngine.isInboundDone()) {
endOfStream = true;
}
if (inPlainBuf.position() > 0) {
inPlainBuf.flip();
try {
ensureHandler().inputReady(protocolSession, inPlainBuf.hasRemaining() ? inPlainBuf : null);
} finally {
inPlainBuf.clear();
}
}
if (result.getStatus() != SSLEngineResult.Status.OK) {
if (result.getStatus() == SSLEngineResult.Status.BUFFER_UNDERFLOW && endOfStream) {
throw new SSLException("Unable to decrypt incoming data due to unexpected end of stream");
}
break;
}
} finally {
inPlain.release();
}
}
} finally {
inEncryptedBuf.compact();
// Release inEncrypted if empty
if (inEncryptedBuf.position() == 0) {
inEncrypted.release();
}
}
}
if (endOfStream && !inEncrypted.hasData()) {
ensureHandler().inputReady(protocolSession, null);
}
}