diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpServerKeepAliveHandler.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpServerKeepAliveHandler.java index c6305a5e2a..2881333285 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpServerKeepAliveHandler.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpServerKeepAliveHandler.java @@ -82,7 +82,7 @@ public class HttpServerKeepAliveHandler extends ChannelDuplexHandler { } } if (msg instanceof LastHttpContent && !shouldKeepAlive()) { - promise.addListener(ChannelFutureListener.CLOSE); + promise = promise.unvoid().addListener(ChannelFutureListener.CLOSE); } super.write(ctx, msg, promise); } diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/HttpServerKeepAliveHandlerTest.java b/codec-http/src/test/java/io/netty/handler/codec/http/HttpServerKeepAliveHandlerTest.java index bcd64bebad..1332a2b8a8 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/HttpServerKeepAliveHandlerTest.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/HttpServerKeepAliveHandlerTest.java @@ -117,6 +117,34 @@ public class HttpServerKeepAliveHandlerTest { assertFalse(channel.finishAndReleaseAll()); } + @Test + public void testConnectionCloseHeaderHandledCorrectly() throws Exception { + HttpResponse response = new DefaultFullHttpResponse(httpVersion, responseStatus); + response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE); + setupMessageLength(response); + + channel.writeAndFlush(response); + HttpResponse writtenResponse = channel.readOutbound(); + + assertFalse(channel.isOpen()); + ReferenceCountUtil.release(writtenResponse); + assertFalse(channel.finishAndReleaseAll()); + } + + @Test + public void testConnectionCloseHeaderHandledCorrectlyForVoidPromise() throws Exception { + HttpResponse response = new DefaultFullHttpResponse(httpVersion, responseStatus); + response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE); + setupMessageLength(response); + + channel.writeAndFlush(response, channel.voidPromise()); + HttpResponse writtenResponse = channel.readOutbound(); + + assertFalse(channel.isOpen()); + ReferenceCountUtil.release(writtenResponse); + assertFalse(channel.finishAndReleaseAll()); + } + @Test public void test_PipelineKeepAlive() { FullHttpRequest firstRequest = new DefaultFullHttpRequest(httpVersion, HttpMethod.GET, "/v1/foo/bar");