}
public void filterWrite(NextFilter nextFilter, IoSession session,
WriteRequest writeRequest) throws SSLException {
boolean needsFlush = true;
SSLHandler handler = getSSLSessionHandler(session);
synchronized (handler) {
if (!isSSLStarted(session)) {
handler.scheduleFilterWrite(nextFilter,
writeRequest);
}
// Don't encrypt the data if encryption is disabled.
else if (session.containsAttribute(DISABLE_ENCRYPTION_ONCE)) {
// Remove the marker attribute because it is temporary.
session.removeAttribute(DISABLE_ENCRYPTION_ONCE);
handler.scheduleFilterWrite(nextFilter,
writeRequest);
} else {
// Otherwise, encrypt the buffer.
ByteBuffer buf = (ByteBuffer) writeRequest.getMessage();
if (SessionLog.isDebugEnabled(session)) {
SessionLog.debug(session, " Filtered Write: " + handler);
}
if (handler.isWritingEncryptedData()) {
// data already encrypted; simply return buffer
if (SessionLog.isDebugEnabled(session)) {
SessionLog.debug(session, " already encrypted: "
+ buf);
}
handler.scheduleFilterWrite(nextFilter,
writeRequest);
} else if (handler.isHandshakeComplete()) {
// SSL encrypt
if (SessionLog.isDebugEnabled(session)) {
SessionLog.debug(session, " encrypt: " + buf);
}
int pos = buf.position();
handler.encrypt(buf.buf());
buf.position(pos);
ByteBuffer encryptedBuffer = new EncryptedBuffer(SSLHandler
.copy(handler.getOutNetBuffer()), buf);
if (SessionLog.isDebugEnabled(session)) {
SessionLog.debug(session, " encrypted buf: "
+ encryptedBuffer);
}
handler.scheduleFilterWrite(nextFilter,
new WriteRequest(encryptedBuffer, writeRequest
.getFuture()));
} else {
if (!session.isConnected()) {
if (SessionLog.isDebugEnabled(session)) {
SessionLog.debug(session,
" Write request on closed session.");
}
} else {
if (SessionLog.isDebugEnabled(session)) {
SessionLog
.debug(session,
" Handshaking is not complete yet. Buffering write request.");
}
handler.schedulePreHandshakeWriteRequest(nextFilter,
writeRequest);
}
needsFlush = false;
}
}
}
if (needsFlush) {
handler.flushScheduledEvents();
}
}