diff --git a/spring-web/src/test/java/org/springframework/http/codec/multipart/SynchronossPartHttpMessageReaderTests.java b/spring-web/src/test/java/org/springframework/http/codec/multipart/SynchronossPartHttpMessageReaderTests.java index 74d3fb0db0cfa20720a2b9091aa4ca723dbbdf0f..03f848a1a4cc4476b0149d779d0ce07d2940423f 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/multipart/SynchronossPartHttpMessageReaderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/multipart/SynchronossPartHttpMessageReaderTests.java @@ -18,6 +18,7 @@ package org.springframework.http.codec.multipart; import java.io.File; import java.io.IOException; +import java.nio.channels.ReadableByteChannel; import java.time.Duration; import java.util.Map; import java.util.function.Consumer; @@ -44,6 +45,7 @@ import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest; import org.springframework.util.MultiValueMap; import static java.util.Collections.emptyMap; +import static java.util.Collections.singletonMap; import static org.hamcrest.core.StringStartsWith.startsWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -149,6 +151,24 @@ public class SynchronossPartHttpMessageReaderTests { subscriber.cancel(); } + @Test + public void gh23768() throws IOException { + ReadableByteChannel channel = new ClassPathResource("invalid.multipart", getClass()).readableChannel(); + Flux body = DataBufferUtils.readByteChannel(() -> channel, this.bufferFactory, 1024); + + MediaType contentType = new MediaType("multipart", "form-data", + singletonMap("boundary", "NbjrKgjbsaMLdnMxMfDpD6myWomYc0qNX0w")); + ServerHttpRequest request = MockServerHttpRequest.post("/") + .contentType(contentType) + .body(body); + + Mono> parts = this.reader.readMono(PARTS_ELEMENT_TYPE, request, emptyMap()); + + StepVerifier.create(parts) + .assertNext(result -> assertThat(result).isEmpty()) + .verifyComplete(); + } + @Test public void readTooManyParts() { testMultipartExceptions(reader -> reader.setMaxParts(1), ex -> { diff --git a/spring-web/src/test/resources/org/springframework/http/codec/multipart/invalid.multipart b/spring-web/src/test/resources/org/springframework/http/codec/multipart/invalid.multipart new file mode 100644 index 0000000000000000000000000000000000000000..9f09680d0433e9cc077eccce1799f66f6d34ea2e --- /dev/null +++ b/spring-web/src/test/resources/org/springframework/http/codec/multipart/invalid.multipart @@ -0,0 +1,5 @@ +--NbjrKgjbsaMLdnMxMfDpD6myWomYc0qNX0w +Content-Disposition: form-data; name="part-00-name" + +post-payload-text-23456789ABCDEF:post-payload-0001-3456789ABCDEF:post-payload-0002-3456789ABCDEF:post-payload-0003-3456789ABCDEF +--NbjrKgjbsaMLdnMxMfDpD6myWomYc