Send a websocket close frame with status code when receiving invalid frames
Motivation: According to the websocket specification peers may send a close frame when they detect a protocol violation (with status code 1002). The current implementation simply closes the connection. This update should add this functionality. The functionality is optional - but it might help other implementations with debugging when they receive such a frame. Modification: When a protocol violation in the decoder is detected and a close was not already initiated by the remote peer a close frame is sent. Result: Remotes which will send an invalid frame will now get a close frame that indicates the protocol violation instead of only seeing a closed connection.
This commit is contained in:
parent
01b0691ee0
commit
ea3c26b65e
@ -314,8 +314,8 @@ public class WebSocket08FrameDecoder extends ReplayingDecoder<WebSocket08FrameDe
|
||||
return;
|
||||
}
|
||||
if (frameOpcode == OPCODE_CLOSE) {
|
||||
checkCloseFrameBody(ctx, framePayload);
|
||||
receivedClosingHandshake = true;
|
||||
checkCloseFrameBody(ctx, framePayload);
|
||||
out.add(new CloseWebSocketFrame(frameFinalFlag, frameRsv, framePayload));
|
||||
framePayload = null;
|
||||
return;
|
||||
@ -414,7 +414,13 @@ public class WebSocket08FrameDecoder extends ReplayingDecoder<WebSocket08FrameDe
|
||||
private void protocolViolation(ChannelHandlerContext ctx, CorruptedFrameException ex) {
|
||||
checkpoint(State.CORRUPT);
|
||||
if (ctx.channel().isActive()) {
|
||||
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
|
||||
Object closeMessage;
|
||||
if (receivedClosingHandshake) {
|
||||
closeMessage = Unpooled.EMPTY_BUFFER;
|
||||
} else {
|
||||
closeMessage = new CloseWebSocketFrame(1002, null);
|
||||
}
|
||||
ctx.writeAndFlush(closeMessage).addListener(ChannelFutureListener.CLOSE);
|
||||
}
|
||||
throw ex;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user