Browse Source

[#547] process websocket CloseFrame

- If an endpoint receives a Close frame and did not previously send a
Close frame, the endpoint MUST send a Close frame in response.
master
hangsu.cho 7 years ago
parent
commit
16dc14a7fa
  1. 3
      src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java
  2. 53
      src/test/java/com/corundumstudio/socketio/transport/WebSocketTransportTest.java

3
src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java

@ -80,8 +80,7 @@ public class WebSocketTransport extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof CloseWebSocketFrame) {
ctx.channel().close();
ReferenceCountUtil.release(msg);
ctx.channel().writeAndFlush(msg).addListener(ChannelFutureListener.CLOSE);
} else if (msg instanceof BinaryWebSocketFrame
|| msg instanceof TextWebSocketFrame) {
ByteBufHolder frame = (ByteBufHolder) msg;

53
src/test/java/com/corundumstudio/socketio/transport/WebSocketTransportTest.java

@ -0,0 +1,53 @@
/*
* @(#)WebSocketTransportTest.java 2018. 5. 23.
*
* Copyright 2018 NAVER Corp. All rights Reserved. NAVER PROPRIETARY/CONFIDENTIAL. Use is subject to
* license terms.
*/
package com.corundumstudio.socketio.transport;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
/**
* @author hangsu.cho@navercorp.com
*
*/
public class WebSocketTransportTest {
/**
* Test method for {@link com.corundumstudio.socketio.transport.WebSocketTransport#channelRead()}.
*/
@Test
public void testCloseFrame() {
EmbeddedChannel channel = createChannel();
channel.writeInbound(new CloseWebSocketFrame());
Object msg = channel.readOutbound();
// https://tools.ietf.org/html/rfc6455#section-5.5.1
// If an endpoint receives a Close frame and did not previously send a Close frame, the endpoint
// MUST send a Close frame in response.
assertTrue(msg instanceof CloseWebSocketFrame);
}
private EmbeddedChannel createChannel() {
return new EmbeddedChannel(new WebSocketTransport(false, null, null, null, null) {
/*
* (non-Javadoc)
*
* @see
* com.corundumstudio.socketio.transport.WebSocketTransport#channelInactive(io.netty.channel.
* ChannelHandlerContext)
*/
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {}
});
}
}
Loading…
Cancel
Save