diff --git a/spring-web/src/main/java/org/springframework/http/codec/multipart/PartEventHttpMessageReader.java b/spring-web/src/main/java/org/springframework/http/codec/multipart/PartEventHttpMessageReader.java index 7be0508ce64..28916e52606 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/multipart/PartEventHttpMessageReader.java +++ b/spring-web/src/main/java/org/springframework/http/codec/multipart/PartEventHttpMessageReader.java @@ -191,7 +191,14 @@ public class PartEventHttpMessageReader extends LoggingCodecSupport implements H private Publisher createEvents(HttpHeaders headers, Flux bodyTokens) { if (MultipartUtils.isFormField(headers)) { Flux contents = bodyTokens.map(MultipartParser.BodyToken::buffer); - int maxSize = (int) Math.min(this.maxInMemorySize, this.maxPartSize); + int maxSize; + if (this.maxPartSize == -1) { + maxSize = this.maxInMemorySize; + } + else { + // maxInMemorySize is an int, so we can safely cast the long result of Math.min + maxSize = (int) Math.min(this.maxInMemorySize, this.maxPartSize); + } return DataBufferUtils.join(contents, maxSize) .map(content -> { String value = content.toString(MultipartUtils.charset(headers)); @@ -222,8 +229,13 @@ public class PartEventHttpMessageReader extends LoggingCodecSupport implements H } private boolean tooLarge(AtomicLong partSize, DataBuffer buffer) { - long size = partSize.addAndGet(buffer.readableByteCount()); - return this.maxPartSize > 0 && size > this.maxPartSize; + if (this.maxPartSize != -1) { + long size = partSize.addAndGet(buffer.readableByteCount()); + return size > this.maxPartSize; + } + else { + return false; + } } } diff --git a/spring-web/src/test/java/org/springframework/http/codec/multipart/PartEventHttpMessageReaderTests.java b/spring-web/src/test/java/org/springframework/http/codec/multipart/PartEventHttpMessageReaderTests.java index 853b3b10cbd..67e1768ae8a 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/multipart/PartEventHttpMessageReaderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/multipart/PartEventHttpMessageReaderTests.java @@ -257,7 +257,21 @@ class PartEventHttpMessageReaderTests { .assertNext(data(headersFormField("text2"), bodyText("b"), true)) .expectError(DataBufferLimitException.class) .verify(); + } + @Test + void formPartTooLarge() { + MockServerHttpRequest request = createRequest( + new ClassPathResource("simple.multipart", getClass()), "simple-boundary"); + + PartEventHttpMessageReader reader = new PartEventHttpMessageReader(); + reader.setMaxInMemorySize(40); + + Flux result = reader.read(forClass(PartEvent.class), request, emptyMap()); + + StepVerifier.create(result) + .expectError(DataBufferLimitException.class) + .verify(); } @Test