in core/src/main/java/org/apache/mina/transport/nio/SslHelper.java [394:443]
WriteRequest processWrite(AbstractIoSession session, Object message, Queue<WriteRequest> writeQueue) {
WriteRequest request = null;
switch (state) {
case CREDENTAILS_AVAILABLE:
ByteBuffer buf = (ByteBuffer) message;
ByteBuffer appBuffer = ByteBuffer.allocate(sslEngine.getSession().getPacketBufferSize());
try {
boolean done = false;
while (!done) {
// Encrypt the message
SSLEngineResult result = sslEngine.wrap(buf, appBuffer);
switch (result.getStatus()) {
case BUFFER_OVERFLOW:
// Increase the buffer size as needed
appBuffer = ByteBuffer.allocate(appBuffer.capacity() + 4096);
break;
case CLOSED:
switchToNoSecure(session);
done = true;
break;
case BUFFER_UNDERFLOW:
case OK:
// We are done. Flip the buffer and push it to the write queue.
appBuffer.flip();
done = buf.remaining() == 0;
if (done) {
request = new DefaultWriteRequest(appBuffer, buf, done);
} else {
writeQueue.offer(new DefaultWriteRequest(appBuffer, buf, done));
appBuffer = ByteBuffer.allocateDirect(appBuffer.capacity());
}
break;
}
}
} catch (SSLException se) {
throw new IllegalStateException(se.getMessage());
}
break;
case CREDENTIALS_NOT_YET_AVAILABLE:
messages.add(new DefaultWriteRequest(message));
break;
case NO_CREDENTIALS:
request = new DefaultWriteRequest(message);
break;
}
return request;
}