Fix bug in calculation of maximum form part size
See gh-31343
This commit is contained in:
parent
b3a6dbaab3
commit
efb93ca109
|
|
@ -191,7 +191,14 @@ public class PartEventHttpMessageReader extends LoggingCodecSupport implements H
|
||||||
private Publisher<? extends PartEvent> createEvents(HttpHeaders headers, Flux<MultipartParser.BodyToken> bodyTokens) {
|
private Publisher<? extends PartEvent> createEvents(HttpHeaders headers, Flux<MultipartParser.BodyToken> bodyTokens) {
|
||||||
if (MultipartUtils.isFormField(headers)) {
|
if (MultipartUtils.isFormField(headers)) {
|
||||||
Flux<DataBuffer> contents = bodyTokens.map(MultipartParser.BodyToken::buffer);
|
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)
|
return DataBufferUtils.join(contents, maxSize)
|
||||||
.map(content -> {
|
.map(content -> {
|
||||||
String value = content.toString(MultipartUtils.charset(headers));
|
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) {
|
private boolean tooLarge(AtomicLong partSize, DataBuffer buffer) {
|
||||||
|
if (this.maxPartSize != -1) {
|
||||||
long size = partSize.addAndGet(buffer.readableByteCount());
|
long size = partSize.addAndGet(buffer.readableByteCount());
|
||||||
return this.maxPartSize > 0 && size > this.maxPartSize;
|
return size > this.maxPartSize;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -257,7 +257,21 @@ class PartEventHttpMessageReaderTests {
|
||||||
.assertNext(data(headersFormField("text2"), bodyText("b"), true))
|
.assertNext(data(headersFormField("text2"), bodyText("b"), true))
|
||||||
.expectError(DataBufferLimitException.class)
|
.expectError(DataBufferLimitException.class)
|
||||||
.verify();
|
.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
|
@Test
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue