diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/AbstractHttpData.java b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/AbstractHttpData.java index 39cbde8ffd5..406fc0871ae 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/AbstractHttpData.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/AbstractHttpData.java @@ -83,7 +83,11 @@ public boolean isCompleted() { } protected void setCompleted() { - completed = true; + setCompleted(true); + } + + protected void setCompleted(boolean completed) { + this.completed = completed; } @Override diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/DiskAttribute.java b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/DiskAttribute.java index 6673ac619cb..bb22afc7ec6 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/DiskAttribute.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/DiskAttribute.java @@ -242,6 +242,7 @@ public Attribute replace(ByteBuf content) { throw new ChannelException(e); } } + attr.setCompleted(isCompleted()); return attr; } diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/DiskFileUpload.java b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/DiskFileUpload.java index cb52d8814ba..0740a922d2d 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/DiskFileUpload.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/DiskFileUpload.java @@ -210,6 +210,7 @@ public FileUpload replace(ByteBuf content) { throw new ChannelException(e); } } + upload.setCompleted(isCompleted()); return upload; } diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/MemoryAttribute.java b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/MemoryAttribute.java index ac1db7490b0..25a7bbf32ec 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/MemoryAttribute.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/MemoryAttribute.java @@ -167,6 +167,7 @@ public Attribute replace(ByteBuf content) { throw new ChannelException(e); } } + attr.setCompleted(isCompleted()); return attr; } diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/MemoryFileUpload.java b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/MemoryFileUpload.java index 06280e39a44..de1cbe25d0c 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/multipart/MemoryFileUpload.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/multipart/MemoryFileUpload.java @@ -154,11 +154,11 @@ public FileUpload replace(ByteBuf content) { if (content != null) { try { upload.setContent(content); - return upload; } catch (IOException e) { throw new ChannelException(e); } } + upload.setCompleted(isCompleted()); return upload; } diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpDataTest.java b/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpDataTest.java index 17f90e70fa3..7c8355b5ef5 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpDataTest.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/multipart/HttpDataTest.java @@ -17,6 +17,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.Unpooled; import io.netty.util.CharsetUtil; import org.assertj.core.api.ThrowableAssert; import org.junit.jupiter.api.BeforeAll; @@ -68,6 +69,20 @@ void testAddContentEmptyBuffer(HttpData httpData) throws IOException { assertThat(content.refCnt()).isEqualTo(0); } + @ParameterizedHttpDataTest + void testCompletedFlagPreservedAfterRetainDuplicate(HttpData httpData) throws IOException { + httpData.addContent(Unpooled.wrappedBuffer("foo".getBytes(CharsetUtil.UTF_8)), false); + assertThat(httpData.isCompleted()).isFalse(); + HttpData duplicate = httpData.retainedDuplicate(); + assertThat(duplicate.isCompleted()).isFalse(); + assertThat(duplicate.release()).isTrue(); + httpData.addContent(Unpooled.wrappedBuffer("bar".getBytes(CharsetUtil.UTF_8)), true); + assertThat(httpData.isCompleted()).isTrue(); + duplicate = httpData.retainedDuplicate(); + assertThat(duplicate.isCompleted()).isTrue(); + assertThat(duplicate.release()).isTrue(); + } + @Test void testAddContentExceedsDefinedSizeDiskFileUpload() { doTestAddContentExceedsSize(