diff --git a/pom.xml b/pom.xml index 0316b921c..4ef36f9fb 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 org.java-websocket Java-WebSocket - 1.3.1-SNAPSHOT + 1.3.0.continuations jar Java WebSocket http://java-websocket.org/ diff --git a/src/main/java/org/java_websocket/WebSocketImpl.java b/src/main/java/org/java_websocket/WebSocketImpl.java index 949fb8c8f..a6a52f3b0 100644 --- a/src/main/java/org/java_websocket/WebSocketImpl.java +++ b/src/main/java/org/java_websocket/WebSocketImpl.java @@ -350,6 +350,9 @@ private void decodeFrames( ByteBuffer socketBuffer ) { } else if( curop == Opcode.PONG ) { wsl.onWebsocketPong( this, f ); continue; + } else if( curop == Opcode.CONTINUATION ) { + wsl.onWebsocketContinuation( this, f ); + continue; } else if( !fin || curop == Opcode.CONTINUOUS ) { if( curop != Opcode.CONTINUOUS ) { if( current_continuous_frame_opcode != null ) diff --git a/src/main/java/org/java_websocket/WebSocketListener.java b/src/main/java/org/java_websocket/WebSocketListener.java index e16f69dd9..1c19b3da0 100644 --- a/src/main/java/org/java_websocket/WebSocketListener.java +++ b/src/main/java/org/java_websocket/WebSocketListener.java @@ -136,6 +136,11 @@ public interface WebSocketListener { **/ public void onWebsocketPong( WebSocket conn, Framedata f ); + /** + * Called when a continuation frame is received (in response to a from-client-to-server PING - yes, NOT PONG!). + **/ + public void onWebsocketContinuation( WebSocket conn, Framedata f ); + /** * Gets the XML string that should be returned if a client requests a Flash * security policy. diff --git a/src/main/java/org/java_websocket/client/WebSocketClient.java b/src/main/java/org/java_websocket/client/WebSocketClient.java index 86eff7947..fc1f65482 100644 --- a/src/main/java/org/java_websocket/client/WebSocketClient.java +++ b/src/main/java/org/java_websocket/client/WebSocketClient.java @@ -298,6 +298,10 @@ public final void onWriteDemand( WebSocket conn ) { // nothing to do } + @Override + public void onWebsocketContinuation( WebSocket conn, Framedata f ) { + } + @Override public void onWebsocketCloseInitiated( WebSocket conn, int code, String reason ) { onCloseInitiated( code, reason ); diff --git a/src/main/java/org/java_websocket/drafts/Draft_10.java b/src/main/java/org/java_websocket/drafts/Draft_10.java index 305460a52..c4a581f1a 100644 --- a/src/main/java/org/java_websocket/drafts/Draft_10.java +++ b/src/main/java/org/java_websocket/drafts/Draft_10.java @@ -304,12 +304,13 @@ public Framedata translateSingleFrame( ByteBuffer buffer ) throws IncompleteExce byte b1 = buffer.get( /*0*/); boolean FIN = b1 >> 8 != 0; byte rsv = (byte) ( ( b1 & ~(byte) 128 ) >> 4 ); - if( rsv != 0 ) - throw new InvalidFrameException( "bad rsv " + rsv ); + boolean isContinuation = rsv != 0; +// if( rsv != 0 ) +// throw new InvalidFrameException( "bad rsv " + rsv ); byte b2 = buffer.get( /*1*/); boolean MASK = ( b2 & -128 ) != 0; int payloadlength = (byte) ( b2 & ~(byte) 128 ); - Opcode optcode = toOpcode( (byte) ( b1 & 15 ) ); + Opcode optcode = isContinuation ? Opcode.CONTINUATION : toOpcode( (byte) ( b1 & 15 ) ); if( !FIN ) { if( optcode == Opcode.PING || optcode == Opcode.PONG || optcode == Opcode.CLOSING ) { diff --git a/src/main/java/org/java_websocket/framing/Framedata.java b/src/main/java/org/java_websocket/framing/Framedata.java index 3dfa8c086..eab8e16e7 100644 --- a/src/main/java/org/java_websocket/framing/Framedata.java +++ b/src/main/java/org/java_websocket/framing/Framedata.java @@ -6,7 +6,7 @@ public interface Framedata { public enum Opcode { - CONTINUOUS, TEXT, BINARY, PING, PONG, CLOSING + CONTINUOUS, TEXT, BINARY, PING, PONG, CLOSING, CONTINUATION // more to come } public boolean isFin(); diff --git a/src/main/java/org/java_websocket/server/WebSocketServer.java b/src/main/java/org/java_websocket/server/WebSocketServer.java index 12cea2f1d..d0b1b61d8 100644 --- a/src/main/java/org/java_websocket/server/WebSocketServer.java +++ b/src/main/java/org/java_websocket/server/WebSocketServer.java @@ -576,6 +576,10 @@ public final void onWriteDemand( WebSocket w ) { selector.wakeup(); } + @Override + public void onWebsocketContinuation( WebSocket conn, Framedata f ) { + } + @Override public void onWebsocketCloseInitiated( WebSocket conn, int code, String reason ) { onCloseInitiated( conn, code, reason ); @@ -584,7 +588,6 @@ public void onWebsocketCloseInitiated( WebSocket conn, int code, String reason ) @Override public void onWebsocketClosing( WebSocket conn, int code, String reason, boolean remote ) { onClosing( conn, code, reason, remote ); - } public void onCloseInitiated( WebSocket conn, int code, String reason ) {