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)); }