diff --git a/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java b/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java index ccbbb73..8b1c3dd 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java +++ b/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; diff --git a/src/test/java/com/corundumstudio/socketio/transport/WebSocketTransportTest.java b/src/test/java/com/corundumstudio/socketio/transport/WebSocketTransportTest.java new file mode 100644 index 0000000..a54e3ae --- /dev/null +++ b/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 {} + }); + } + +}