From 7d2d742a43d99eef3d7e935422fefdf8a2522566 Mon Sep 17 00:00:00 2001 From: norman Date: Thu, 3 May 2012 09:17:37 +0200 Subject: [PATCH] Make sure ChunkedInput.close() is not called before the write is complete. See #303 --- .../netty/handler/stream/ChunkedWriteHandler.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java b/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java index 96b2838511..bad00834b3 100644 --- a/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java +++ b/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java @@ -211,7 +211,7 @@ public class ChunkedWriteHandler implements ChannelUpstreamHandler, ChannelDowns final MessageEvent currentEvent = this.currentEvent; Object m = currentEvent.getMessage(); if (m instanceof ChunkedInput) { - ChunkedInput chunks = (ChunkedInput) m; + final ChunkedInput chunks = (ChunkedInput) m; Object chunk; boolean endOfInput; boolean suspend; @@ -248,8 +248,18 @@ public class ChunkedWriteHandler implements ChannelUpstreamHandler, ChannelDowns ChannelFuture writeFuture; if (endOfInput) { this.currentEvent = null; - closeInput(chunks); writeFuture = currentEvent.getFuture(); + + // Register a listener which will close the input once the write is complete. This is needed because the Chunk may have + // some resource bound that can not be closed before its not written + // + // See https://github.com/netty/netty/issues/303 + writeFuture.addListener(new ChannelFutureListener() { + + public void operationComplete(ChannelFuture future) throws Exception { + closeInput(chunks); + } + }); } else { writeFuture = future(channel); writeFuture.addListener(new ChannelFutureListener() {