@@ -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