* Added WebSocketFrame.CLOSING_HANDSHAKE
* WebSocketFrameDecoder discards data if closing handshake was received before
This commit is contained in:
parent
35351701ff
commit
3156ed5dd5
@ -16,6 +16,7 @@
|
|||||||
package org.jboss.netty.handler.codec.http.websocket;
|
package org.jboss.netty.handler.codec.http.websocket;
|
||||||
|
|
||||||
import org.jboss.netty.buffer.ChannelBuffer;
|
import org.jboss.netty.buffer.ChannelBuffer;
|
||||||
|
import org.jboss.netty.buffer.ChannelBuffers;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Web Socket frame that represents either text or binary data.
|
* A Web Socket frame that represents either text or binary data.
|
||||||
@ -26,6 +27,11 @@ import org.jboss.netty.buffer.ChannelBuffer;
|
|||||||
*/
|
*/
|
||||||
public interface WebSocketFrame {
|
public interface WebSocketFrame {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closing handshake message (<tt>0xFF, 0x00</tt>)
|
||||||
|
*/
|
||||||
|
WebSocketFrame CLOSING_HANDSHAKE = new DefaultWebSocketFrame(0xFF, ChannelBuffers.EMPTY_BUFFER);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the type of this frame.
|
* Returns the type of this frame.
|
||||||
* <tt>0x00-0x7F</tt> means a text frame encoded in UTF-8, and
|
* <tt>0x00-0x7F</tt> means a text frame encoded in UTF-8, and
|
||||||
|
@ -42,6 +42,7 @@ public class WebSocketFrameDecoder extends ReplayingDecoder<VoidEnum> {
|
|||||||
public static final int DEFAULT_MAX_FRAME_SIZE = 16384;
|
public static final int DEFAULT_MAX_FRAME_SIZE = 16384;
|
||||||
|
|
||||||
private final int maxFrameSize;
|
private final int maxFrameSize;
|
||||||
|
private boolean receivedClosingHandshake;
|
||||||
|
|
||||||
public WebSocketFrameDecoder() {
|
public WebSocketFrameDecoder() {
|
||||||
this(DEFAULT_MAX_FRAME_SIZE);
|
this(DEFAULT_MAX_FRAME_SIZE);
|
||||||
@ -60,6 +61,14 @@ public class WebSocketFrameDecoder extends ReplayingDecoder<VoidEnum> {
|
|||||||
@Override
|
@Override
|
||||||
protected Object decode(ChannelHandlerContext ctx, Channel channel,
|
protected Object decode(ChannelHandlerContext ctx, Channel channel,
|
||||||
ChannelBuffer buffer, VoidEnum state) throws Exception {
|
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();
|
byte type = buffer.readByte();
|
||||||
if ((type & 0x80) == 0x80) {
|
if ((type & 0x80) == 0x80) {
|
||||||
// If the MSB on type is set, decode the frame length
|
// If the MSB on type is set, decode the frame length
|
||||||
@ -88,6 +97,10 @@ public class WebSocketFrameDecoder extends ReplayingDecoder<VoidEnum> {
|
|||||||
}
|
}
|
||||||
} while ((b & 0x80) == 0x80);
|
} while ((b & 0x80) == 0x80);
|
||||||
|
|
||||||
|
if (type == 0xFF && frameSize == 0) {
|
||||||
|
receivedClosingHandshake = true;
|
||||||
|
}
|
||||||
|
|
||||||
return new DefaultWebSocketFrame(
|
return new DefaultWebSocketFrame(
|
||||||
type, buffer.readBytes((int) frameSize));
|
type, buffer.readBytes((int) frameSize));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user