Skip to content

Commit a2e09f1

Browse files
committed
fixed case in which a the bytes could be skipped when the handshake was
received in multiple parts and the last part was including nonpayload data.
1 parent 62306de commit a2e09f1

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

src/main/java/org/java_websocket/WebSocketImpl.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)