Return-Path: Delivered-To: apmail-directory-commits-archive@www.apache.org Received: (qmail 47809 invoked from network); 23 Apr 2005 02:41:08 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 23 Apr 2005 02:41:08 -0000 Received: (qmail 63683 invoked by uid 500); 23 Apr 2005 02:41:37 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 63639 invoked by uid 500); 23 Apr 2005 02:41:36 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 63626 invoked by uid 99); 23 Apr 2005 02:41:36 -0000 X-ASF-Spam-Status: No, hits=0.2 required=10.0 tests=NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Fri, 22 Apr 2005 19:41:36 -0700 Received: (qmail 47782 invoked by uid 65534); 23 Apr 2005 02:41:06 -0000 Message-ID: <20050423024106.47779.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Subject: svn commit: r164314 - /directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFilter.java /directory/network/trunk/src/java/org/apache/mina/io/filter/SSLHandler.java Date: Sat, 23 Apr 2005 02:41:05 -0000 To: commits@directory.apache.org From: trustin@apache.org X-Mailer: svnmailer-1.0.0-dev X-Virus-Checked: Checked X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: trustin Date: Fri Apr 22 19:41:04 2005 New Revision: 164314 URL: http://svn.apache.org/viewcvs?rev=3D164314&view=3Drev Log: Fixed: SSLFilter doesn't defer write requests until handshaking is complete. Modified: directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFilter.ja= va directory/network/trunk/src/java/org/apache/mina/io/filter/SSLHandler.j= ava Modified: directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFil= ter.java URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apa= che/mina/io/filter/SSLFilter.java?rev=3D164314&r1=3D164313&r2=3D164314&view= =3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFilter.ja= va (original) +++ directory/network/trunk/src/java/org/apache/mina/io/filter/SSLFilter.ja= va Fri Apr 22 19:41:04 2005 @@ -228,10 +228,7 @@ public void sessionOpened( NextFilter nextFilter, IoSession session ) { // Create an SSL handler - if( createSSLSessionHandler( session ) =3D=3D null ) - { - throw new InternalError(); - } + createSSLSessionHandler( session ); nextFilter.sessionOpened( session ); } =20 @@ -332,68 +329,89 @@ public void filterWrite( NextFilter nextFilter, IoSession session, Byt= eBuffer buf, Object marker ) { =20 - SSLHandler sslHandler =3D getSSLSessionHandler( session ); + SSLHandler handler =3D createSSLSessionHandler( session ); if( debug !=3D null ) { - debug.print( this, "Filtered Write: " + sslHandler ); + debug.print( this, "Filtered Write: " + handler ); } =20 - if( sslHandler !=3D null ) + synchronized( handler ) { - synchronized( sslHandler ) + if( handler.isWritingEncryptedData() ) { - if( sslHandler.isWritingEncryptedData() ) + // data already encrypted; simply return buffer + if( debug !=3D null ) + { + debug.print( this, " already encrypted: " + buf ); + } + nextFilter.filterWrite( session, buf, marker ); + return; + } + =20 + if( handler.isInitialHandshakeComplete() ) + { + // SSL encrypt + try { - // data already encrypted; simply return buffer if( debug !=3D null ) { - debug.print( this, " already encrypted: " + buf ); + debug.print( this, "encrypt: " + buf ); } - nextFilter.filterWrite( session, buf, marker ); + handler.encrypt( buf.buf() ); + ByteBuffer encryptedBuffer =3D copy( handler + .getOutNetBuffer() ); + + if( debug !=3D null ) + { + debug.print( this, "encrypted buf: " + encryptedBu= ffer); + } + buf.release(); + nextFilter.filterWrite( session, encryptedBuffer, mark= er ); return; } - if( sslHandler.isInitialHandshakeComplete() ) + catch( SSLException ssle ) { - // SSL encrypt - try + throw new RuntimeException( + "Unexpected SSLException.", ssle ); + } + } + else + { + if( !session.isConnected() ) + { + if( debug !=3D null ) { - if( debug !=3D null ) - { - debug.print( this, "encrypt: " + buf ); - } - sslHandler.encrypt( buf.buf() ); - ByteBuffer encryptedBuffer =3D copy( sslHandler - .getOutNetBuffer() ); - - if( debug !=3D null ) - { - debug.print( this, "encrypted buf: " + encrypt= edBuffer); - } - buf.release(); - nextFilter.filterWrite( session, encryptedBuffer, = marker ); - return; + debug.print( this, "Write request on closed sessio= n=2E" ); } - catch( SSLException ssle ) + } + else + { + if( debug !=3D null ) { - throw new RuntimeException( - "Unexpected SSLException.", ssle ); + debug.print( this, "Handshaking is not complete ye= t=2E Buffering write request." ); } + handler.scheduleWrite( nextFilter, buf, marker ); } } } - =20 - nextFilter.filterWrite( session, buf, marker ); } =20 // Utiliities =20 private void handleSSLData( NextFilter nextFilter, IoSession session, - SSLHandler sslHandler ) throws SSLException + SSLHandler handler ) throws SSLException { - // First write encrypted data to be written (if any) - writeNetBuffer( session, sslHandler ); + // Flush any buffered write requests occurred before handshaking. + if( handler.isInitialHandshakeComplete() ) + { + handler.flushScheduledWrites(); + } + + // Write encrypted data to be written (if any) + writeNetBuffer( session, handler ); + // handle app. data read (if any) - handleAppDataRead( nextFilter, session, sslHandler ); + handleAppDataRead( nextFilter, session, handler ); } =20 private void handleAppDataRead( NextFilter nextFilter, IoSession sessi= on, @@ -418,7 +436,7 @@ void writeNetBuffer( IoSession session, SSLHandler sslHandler ) throws SSLException { - // first check if any net data needed to be writen + // Check if any net data needed to be writen if( !sslHandler.getOutNetBuffer().hasRemaining() ) { // no; bail out @@ -521,10 +539,7 @@ handler =3D new SSLHandler( this, sslContext, session ); sslSessionHandlerMap.put( session, handler ); - if( isUseClientMode() ) - { - handler.doHandshake(); - } + handler.doHandshake(); } catch( SSLException e ) { Modified: directory/network/trunk/src/java/org/apache/mina/io/filter/SSLHan= dler.java URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apa= che/mina/io/filter/SSLHandler.java?rev=3D164314&r1=3D164313&r2=3D164314&vie= w=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/trunk/src/java/org/apache/mina/io/filter/SSLHandler.j= ava (original) +++ directory/network/trunk/src/java/org/apache/mina/io/filter/SSLHandler.j= ava Fri Apr 22 19:41:04 2005 @@ -25,7 +25,10 @@ import javax.net.ssl.SSLEngineResult; import javax.net.ssl.SSLException; import javax.net.ssl.SSLSession; + import org.apache.mina.io.IoSession; +import org.apache.mina.io.IoHandlerFilter.NextFilter; +import org.apache.mina.util.Queue; =20 /** * A helper class using the SSLEngine API to decrypt/encrypt data. @@ -42,6 +45,14 @@ { private final SSLFilter parent; =20 + private final IoSession session; + =20 + private final Queue nextFilterQueue =3D new Queue(); + =20 + private final Queue writeBufferQueue =3D new Queue(); + =20 + private final Queue writeMarkerQueue =3D new Queue(); + private SSLEngine sslEngine; =20 /** @@ -83,8 +94,7 @@ private boolean closed =3D false; =20 private boolean isWritingEncryptedData =3D false; - private IoSession session =3D null; - + =20 /** * Constuctor. * @@ -164,6 +174,31 @@ public boolean needToCompleteInitialHandshake() { return ( initialHandshakeStatus =3D=3D SSLEngineResult.HandshakeSt= atus.NEED_WRAP && !closed ); + } + =20 + public synchronized void scheduleWrite( NextFilter nextFilter, org.apa= che.mina.common.ByteBuffer buf, Object marker ) + { + nextFilterQueue.push( nextFilter ); + writeBufferQueue.push( buf ); + writeMarkerQueue.push( marker ); + } + =20 + public synchronized void flushScheduledWrites() + { + NextFilter nextFilter; + org.apache.mina.common.ByteBuffer scheduledBuf; + Object scheduledMarker; + =20 + while( ( scheduledBuf =3D ( org.apache.mina.common.ByteBuffer ) wr= iteBufferQueue.pop() ) !=3D null ) + { + if( parent.debug !=3D null ) + { + parent.debug.print( parent, "Flushing buffered write reque= st: " + scheduledBuf ); + } + nextFilter =3D ( NextFilter ) nextFilterQueue.pop(); + scheduledMarker =3D writeMarkerQueue.pop(); + parent.filterWrite( nextFilter, session, scheduledBuf, schedul= edMarker ); + } } =20 /**