}
}
public void messageReceived(NextFilter nextFilter, IoSession session,
Object message) throws SSLException {
SSLHandler handler = getSSLSessionHandler(session);
synchronized (handler) {
if (!isSSLStarted(session) && handler.isInboundDone()) {
handler.scheduleMessageReceived(nextFilter, message);
} else {
ByteBuffer buf = (ByteBuffer) message;
if (SessionLog.isDebugEnabled(session)) {
SessionLog.debug(session, " Data Read: " + handler + " ("
+ buf + ')');
}
try {
// forward read encrypted data to SSL handler
handler.messageReceived(nextFilter, buf.buf());
// Handle data to be forwarded to application or written to net
handleSSLData(nextFilter, handler);
if (handler.isInboundDone()) {
if (handler.isOutboundDone()) {
if (SessionLog.isDebugEnabled(session)) {
SessionLog.debug(session,
" SSL Session closed.");
}
handler.destroy();
} else {
initiateClosure(nextFilter, session);
}
if (buf.hasRemaining()) {
handler.scheduleMessageReceived(nextFilter,
buf);
}
}
} catch (SSLException ssle) {
if (!handler.isInitialHandshakeComplete()) {
SSLException newSSLE = new SSLHandshakeException(
"Initial SSL handshake failed.");
newSSLE.initCause(ssle);
ssle = newSSLE;
}
throw ssle;
}
}
}
handler.flushScheduledEvents();
}