@@ -93,7 +93,7 @@ public class WebSocketImpl implements WebSocket {
9393 private Opcode current_continuous_frame_opcode = null ;
9494
9595 /** the bytes of an incomplete received handshake */
96- private ByteBuffer tmpHandshakeBytes ;
96+ private ByteBuffer tmpHandshakeBytes = ByteBuffer . allocate ( 0 ) ;
9797
9898 /** stores the handshake sent by this websocket ( Role.CLIENT only ) */
9999 private ClientHandshake handshakerequest = null ;
@@ -147,8 +147,11 @@ public WebSocketImpl( WebSocketListener listener , List<Draft> drafts , Socket s
147147 *
148148 */
149149 public void decode ( ByteBuffer socketBuffer ) {
150- if ( !socketBuffer .hasRemaining () || flushandclosestate )
150+ assert ( socketBuffer .hasRemaining () );
151+
152+ if ( flushandclosestate ) {
151153 return ;
154+ }
152155
153156 if ( DEBUG )
154157 System .out .println ( "process(" + socketBuffer .remaining () + "): {" + ( socketBuffer .remaining () > 1000 ? "too big to display" : new String ( socketBuffer .array (), socketBuffer .position (), socketBuffer .remaining () ) ) + "}" );
@@ -157,19 +160,24 @@ public void decode( ByteBuffer socketBuffer ) {
157160 decodeFrames ( socketBuffer );
158161 } else {
159162 if ( decodeHandshake ( socketBuffer ) ) {
160- decodeFrames ( socketBuffer );
163+ assert ( tmpHandshakeBytes .hasRemaining () != socketBuffer .hasRemaining () || !socketBuffer .hasRemaining () ); // the buffers will never have remaining bytes at the same time
164+
165+ if ( socketBuffer .hasRemaining () ) {
166+ decodeFrames ( socketBuffer );
167+ } else if ( tmpHandshakeBytes .hasRemaining () ) {
168+ decodeFrames ( tmpHandshakeBytes );
169+ }
161170 }
162171 }
163172 assert ( isClosing () || isFlushAndClose () || !socketBuffer .hasRemaining () );
164173 }
165-
166174 /**
167175 * Returns whether the handshake phase has is completed.
168176 * In case of a broken handshake this will be never the case.
169177 **/
170178 private boolean decodeHandshake ( ByteBuffer socketBufferNew ) {
171179 ByteBuffer socketBuffer ;
172- if ( tmpHandshakeBytes == null ) {
180+ if ( tmpHandshakeBytes . capacity () == 0 ) {
173181 socketBuffer = socketBufferNew ;
174182 } else {
175183 if ( tmpHandshakeBytes .remaining () < socketBufferNew .remaining () ) {
@@ -257,7 +265,7 @@ private boolean decodeHandshake( ByteBuffer socketBufferNew ) {
257265 draft .setParseMode ( role );
258266 Handshakedata tmphandshake = draft .translateHandshake ( socketBuffer );
259267 if ( tmphandshake instanceof ServerHandshake == false ) {
260- flushAndClose ( CloseFrame .PROTOCOL_ERROR , "Wwrong http function" , false );
268+ flushAndClose ( CloseFrame .PROTOCOL_ERROR , "wrong http function" , false );
261269 return false ;
262270 }
263271 ServerHandshake handshake = (ServerHandshake ) tmphandshake ;
@@ -283,7 +291,7 @@ private boolean decodeHandshake( ByteBuffer socketBufferNew ) {
283291 close ( e );
284292 }
285293 } catch ( IncompleteHandshakeException e ) {
286- if ( tmpHandshakeBytes == null ) {
294+ if ( tmpHandshakeBytes . capacity () == 0 ) {
287295 socketBuffer .reset ();
288296 int newsize = e .getPreferedSize ();
289297 if ( newsize == 0 ) {
0 commit comments