in core/src/main/java/org/apache/mina/transport/nio/SslHelper.java [240:329]
public void processRead(AbstractIoSession session, ByteBuffer readBuffer) throws SSLException {
ByteBuffer tempBuffer;
if (previous != null) {
tempBuffer = accumulate(readBuffer);
} else {
tempBuffer = readBuffer;
}
boolean done = false;
SSLEngineResult result;
ByteBuffer appBuffer = ByteBuffer.allocateDirect(sslEngine.getSession().getApplicationBufferSize());
HandshakeStatus handshakeStatus = sslEngine.getHandshakeStatus();
while (!done) {
switch (handshakeStatus) {
case NEED_UNWRAP:
case NOT_HANDSHAKING:
case FINISHED:
result = sslEngine.unwrap(tempBuffer, appBuffer);
processResult(session, handshakeStatus, result);
switch (result.getStatus()) {
case BUFFER_UNDERFLOW:
/* we need more data */
done = true;
break;
case BUFFER_OVERFLOW:
/* resize output buffer */
appBuffer = ByteBuffer.allocateDirect(appBuffer.capacity() * 2);
break;
case OK:
if ((handshakeStatus == HandshakeStatus.NOT_HANDSHAKING) && (result.bytesProduced() > 0)) {
appBuffer.flip();
session.processMessageReceived(appBuffer);
}
break;
case CLOSED:
break;
}
if (sslEngine != null) {
handshakeStatus = sslEngine.getHandshakeStatus();
} else {
done = true;
}
break;
case NEED_TASK:
Runnable task;
while ((task = sslEngine.getDelegatedTask()) != null) {
task.run();
}
handshakeStatus = sslEngine.getHandshakeStatus();
break;
case NEED_WRAP:
result = sslEngine.wrap(EMPTY_BUFFER, appBuffer);
processResult(session, handshakeStatus, result);
switch (result.getStatus()) {
case BUFFER_OVERFLOW:
appBuffer = ByteBuffer.allocateDirect(appBuffer.capacity() * 2);
break;
case BUFFER_UNDERFLOW:
done = true;
break;
case CLOSED:
case OK:
appBuffer.flip();
WriteRequest writeRequest = new DefaultWriteRequest(appBuffer);
writeRequest.setMessage(appBuffer);
writeRequest.setSecureInternal(true);
session.enqueueWriteRequest(writeRequest);
break;
}
if (sslEngine != null) {
handshakeStatus = sslEngine.getHandshakeStatus();
} else {
done = true;
}
}
if (handshakeStatus == HandshakeStatus.FINISHED) {
state = State.CREDENTAILS_AVAILABLE;
}
}
if (tempBuffer.remaining() > 0) {
previous = duplicate(tempBuffer);
} else {
previous = null;
}
readBuffer.clear();
}