diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/HttpPostMultipartRequestDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/HttpPostMultipartRequestDecoder.java index 5416302811..2bebe22528 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/HttpPostMultipartRequestDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/HttpPostMultipartRequestDecoder.java @@ -915,19 +915,15 @@ public class HttpPostMultipartRequestDecoder implements InterfaceHttpPostRequest */ @Override public void destroy() { - checkDestroyed(); + // Release all data items, including those not yet pulled cleanFiles(); + destroyed = true; if (undecodedChunk != null && undecodedChunk.refCnt() > 0) { undecodedChunk.release(); undecodedChunk = null; } - - // release all data which was not yet pulled - for (int i = bodyListHttpDataRank; i < bodyListHttpData.size(); i++) { - bodyListHttpData.get(i).release(); - } } /** diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpPostRequestDecoderTest.java b/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpPostRequestDecoderTest.java index d29f6b3cd4..7cd0d2c313 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpPostRequestDecoderTest.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpPostRequestDecoderTest.java @@ -24,6 +24,7 @@ import io.netty.handler.codec.http.DefaultFullHttpRequest; import io.netty.handler.codec.http.DefaultHttpContent; import io.netty.handler.codec.http.DefaultHttpRequest; import io.netty.handler.codec.http.DefaultLastHttpContent; +import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpContent; import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpHeaderValues; @@ -689,4 +690,37 @@ public class HttpPostRequestDecoderTest { assertEquals("tmp-0.txt", fileUpload.getFilename()); decoder.destroy(); } + + // https://github.com/netty/netty/issues/8575 + @Test + public void testMultipartRequest() throws Exception { + String BOUNDARY = "01f136d9282f"; + + ByteBuf byteBuf = Unpooled.wrappedBuffer(("--" + BOUNDARY + "\n" + + "Content-Disposition: form-data; name=\"msg_id\"\n" + + "\n" + + "15200\n" + + "--" + BOUNDARY + "\n" + + "Content-Disposition: form-data; name=\"msg\"\n" + + "\n" + + "test message\n" + + "--" + BOUNDARY + "--").getBytes()); + + FullHttpRequest req = new DefaultFullHttpRequest(HttpVersion.HTTP_1_0, HttpMethod.POST, "/up", byteBuf); + req.headers().add(HttpHeaderNames.CONTENT_TYPE, "multipart/form-data; boundary=" + BOUNDARY); + + HttpPostRequestDecoder decoder = + new HttpPostRequestDecoder(new DefaultHttpDataFactory(DefaultHttpDataFactory.MINSIZE), + req, + CharsetUtil.UTF_8); + + assertTrue(decoder.isMultipart()); + assertFalse(decoder.getBodyHttpDatas().isEmpty()); + assertEquals(2, decoder.getBodyHttpDatas().size()); + assertEquals("test message", ((Attribute) decoder.getBodyHttpData("msg")).getValue()); + assertEquals("15200", ((Attribute) decoder.getBodyHttpData("msg_id")).getValue()); + + decoder.destroy(); + assertEquals(1, req.refCnt()); + } }