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 ) {