Browse Source

Fix bug in calculation of maximum form part size

See gh-31343
pull/30231/merge
Arjen Poutsma 1 year ago
parent
commit
efb93ca109
  1. 18
      spring-web/src/main/java/org/springframework/http/codec/multipart/PartEventHttpMessageReader.java
  2. 14
      spring-web/src/test/java/org/springframework/http/codec/multipart/PartEventHttpMessageReaderTests.java

18
spring-web/src/main/java/org/springframework/http/codec/multipart/PartEventHttpMessageReader.java

@ -191,7 +191,14 @@ public class PartEventHttpMessageReader extends LoggingCodecSupport implements H @@ -191,7 +191,14 @@ public class PartEventHttpMessageReader extends LoggingCodecSupport implements H
private Publisher<? extends PartEvent> createEvents(HttpHeaders headers, Flux<MultipartParser.BodyToken> bodyTokens) {
if (MultipartUtils.isFormField(headers)) {
Flux<DataBuffer> 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 @@ -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;
}
}
}

14
spring-web/src/test/java/org/springframework/http/codec/multipart/PartEventHttpMessageReaderTests.java

@ -257,7 +257,21 @@ class PartEventHttpMessageReaderTests { @@ -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<PartEvent> result = reader.read(forClass(PartEvent.class), request, emptyMap());
StepVerifier.create(result)
.expectError(DataBufferLimitException.class)
.verify();
}
@Test

Loading…
Cancel
Save