Configurable limits with Synchronoss

See gh-23884
This commit is contained in:
Brian Clozel
2019-10-22 22:13:44 +02:00
committed by Rossen Stoyanchev
parent 69bcdfc17f
commit ea6f51e9e3
3 changed files with 286 additions and 52 deletions

View File

@@ -17,9 +17,11 @@
package org.springframework.http.codec.multipart;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Map;
import java.util.function.Consumer;
import org.junit.jupiter.api.Test;
import org.reactivestreams.Subscription;
@@ -91,32 +93,32 @@ public class SynchronossPartHttpMessageReaderTests extends AbstractLeakCheckingT
ServerHttpRequest request = generateMultipartRequest();
MultiValueMap<String, Part> parts = this.reader.readMono(PARTS_ELEMENT_TYPE, request, emptyMap()).block();
assertThat(parts).containsOnlyKeys("fooPart", "barPart");
assertThat(parts).containsOnlyKeys("filePart", "textPart");
Part part = parts.getFirst("fooPart");
Part part = parts.getFirst("filePart");
assertThat(part).isInstanceOf(FilePart.class);
assertThat(part.name()).isEqualTo("fooPart");
assertThat(part.name()).isEqualTo("filePart");
assertThat(((FilePart) part).filename()).isEqualTo("foo.txt");
DataBuffer buffer = DataBufferUtils.join(part.content()).block();
assertThat(DataBufferTestUtils.dumpString(buffer, StandardCharsets.UTF_8)).isEqualTo("Lorem Ipsum.");
DataBufferUtils.release(buffer);
part = parts.getFirst("barPart");
part = parts.getFirst("textPart");
assertThat(part).isInstanceOf(FormFieldPart.class);
assertThat(part.name()).isEqualTo("barPart");
assertThat(((FormFieldPart) part).value()).isEqualTo("bar");
assertThat(part.name()).isEqualTo("textPart");
assertThat(((FormFieldPart) part).value()).isEqualTo("sample-text");
}
@Test // SPR-16545
void transferTo() {
void transferTo() throws IOException {
ServerHttpRequest request = generateMultipartRequest();
MultiValueMap<String, Part> parts = this.reader.readMono(PARTS_ELEMENT_TYPE, request, emptyMap()).block();
assertThat(parts).isNotNull();
FilePart part = (FilePart) parts.getFirst("fooPart");
FilePart part = (FilePart) parts.getFirst("filePart");
assertThat(part).isNotNull();
File dest = new File(System.getProperty("java.io.tmpdir") + "/" + part.filename());
File dest = File.createTempFile(part.filename(), "multipart");
part.transferTo(dest).block(Duration.ofSeconds(5));
assertThat(dest.exists()).isTrue();
@@ -139,12 +141,57 @@ public class SynchronossPartHttpMessageReaderTests extends AbstractLeakCheckingT
subscriber.cancel();
}
@Test
void readTooManyParts() {
testMultipartExceptions(
reader -> reader.setMaxPartCount(1),
err -> {
assertThat(err).isInstanceOf(MultipartException.class)
.hasMessage("Could not parse multipart request");
assertThat(err.getCause()).hasMessage("Exceeded limit on maximum number of multipart parts");
}
);
}
@Test
void readFilePartTooBig() {
testMultipartExceptions(
reader -> reader.setMaxFilePartSize(5),
err -> {
assertThat(err).isInstanceOf(MultipartException.class)
.hasMessage("Could not parse multipart request");
assertThat(err.getCause()).hasMessage("Exceeded limit on max size of multipart file : 5");
}
);
}
@Test
void readPartTooBig() {
testMultipartExceptions(
reader -> reader.setMaxPartSize(6),
err -> {
assertThat(err).isInstanceOf(MultipartException.class)
.hasMessage("Could not parse multipart request");
assertThat(err.getCause()).hasMessage("Exceeded limit on max size of multipart part : 6");
}
);
}
private void testMultipartExceptions(Consumer<SynchronossPartHttpMessageReader> configurer,
Consumer<Throwable> assertions) {
SynchronossPartHttpMessageReader synchronossReader = new SynchronossPartHttpMessageReader(this.bufferFactory);
configurer.accept(synchronossReader);
MultipartHttpMessageReader reader = new MultipartHttpMessageReader(synchronossReader);
ServerHttpRequest request = generateMultipartRequest();
StepVerifier.create(reader.readMono(PARTS_ELEMENT_TYPE, request, emptyMap()))
.consumeErrorWith(assertions)
.verify();
}
private ServerHttpRequest generateMultipartRequest() {
MultipartBodyBuilder partsBuilder = new MultipartBodyBuilder();
partsBuilder.part("fooPart", new ClassPathResource("org/springframework/http/codec/multipart/foo.txt"));
partsBuilder.part("barPart", "bar");
partsBuilder.part("filePart", new ClassPathResource("org/springframework/http/codec/multipart/foo.txt"));
partsBuilder.part("textPart", "sample-text");
MockClientHttpRequest outputMessage = new MockClientHttpRequest(HttpMethod.POST, "/");
new MultipartHttpMessageWriter()