}
}
public void filterWrite( NextFilter nextFilter, IoSession session, WriteRequest writeRequest ) throws SSLException
{
SSLHandler handler = getSSLSessionHandler( session );
synchronized( handler )
{
if( !isSSLStarted( session ) )
{
nextFilter.filterWrite( session, writeRequest );
return;
}
// Don't encrypt the data if encryption is disabled.
if( session.containsAttribute( DISABLE_ENCRYPTION_ONCE ) )
{
// Remove the marker attribute because it is temporary.
session.removeAttribute( DISABLE_ENCRYPTION_ONCE );
nextFilter.filterWrite( session, writeRequest );
return;
}
// 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 );
}
nextFilter.filterWrite( session, writeRequest );
return;
}
if( handler.isInitialHandshakeComplete() )
{
// 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);
}
nextFilter.filterWrite( session, new WriteRequest( encryptedBuffer, writeRequest.getFuture() ) );
return;
}
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.scheduleWrite( nextFilter, writeRequest );
}
}
}
}