diff --git a/src/main/java/org/jboss/netty/handler/codec/http/websocket/WebSocketFrame.java b/src/main/java/org/jboss/netty/handler/codec/http/websocket/WebSocketFrame.java
index aa2028875b..dc86d7ad20 100644
--- a/src/main/java/org/jboss/netty/handler/codec/http/websocket/WebSocketFrame.java
+++ b/src/main/java/org/jboss/netty/handler/codec/http/websocket/WebSocketFrame.java
@@ -16,6 +16,7 @@
package org.jboss.netty.handler.codec.http.websocket;
import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
/**
* A Web Socket frame that represents either text or binary data.
@@ -26,6 +27,11 @@ import org.jboss.netty.buffer.ChannelBuffer;
*/
public interface WebSocketFrame {
+ /**
+ * Closing handshake message (0xFF, 0x00)
+ */
+ WebSocketFrame CLOSING_HANDSHAKE = new DefaultWebSocketFrame(0xFF, ChannelBuffers.EMPTY_BUFFER);
+
/**
* Returns the type of this frame.
* 0x00-0x7F means a text frame encoded in UTF-8, and
diff --git a/src/main/java/org/jboss/netty/handler/codec/http/websocket/WebSocketFrameDecoder.java b/src/main/java/org/jboss/netty/handler/codec/http/websocket/WebSocketFrameDecoder.java
index 10370604d4..4d221b27ff 100644
--- a/src/main/java/org/jboss/netty/handler/codec/http/websocket/WebSocketFrameDecoder.java
+++ b/src/main/java/org/jboss/netty/handler/codec/http/websocket/WebSocketFrameDecoder.java
@@ -42,6 +42,7 @@ public class WebSocketFrameDecoder extends ReplayingDecoder {
public static final int DEFAULT_MAX_FRAME_SIZE = 16384;
private final int maxFrameSize;
+ private boolean receivedClosingHandshake;
public WebSocketFrameDecoder() {
this(DEFAULT_MAX_FRAME_SIZE);
@@ -60,6 +61,14 @@ public class WebSocketFrameDecoder extends ReplayingDecoder {
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
ChannelBuffer buffer, VoidEnum state) throws Exception {
+
+ // Discard all data received if closing handshake was received before.
+ if (receivedClosingHandshake) {
+ buffer.skipBytes(actualReadableBytes());
+ return null;
+ }
+
+ // Decode a frame otherwise.
byte type = buffer.readByte();
if ((type & 0x80) == 0x80) {
// If the MSB on type is set, decode the frame length
@@ -88,6 +97,10 @@ public class WebSocketFrameDecoder extends ReplayingDecoder {
}
} while ((b & 0x80) == 0x80);
+ if (type == 0xFF && frameSize == 0) {
+ receivedClosingHandshake = true;
+ }
+
return new DefaultWebSocketFrame(
type, buffer.readBytes((int) frameSize));
}