From a56f735edde2338dcb642028615ae7ecaa962695 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 4 May 2017 11:52:10 -0400 Subject: [PATCH] Polish --- .../multipart/MultipartHttpMessageWriter.java | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java index 8932f28b325..1d9fb69d8a9 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java @@ -26,7 +26,7 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; - +import java.util.stream.Collectors; import javax.mail.internet.MimeUtility; import org.reactivestreams.Publisher; @@ -71,28 +71,18 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter(CharSequenceEncoder.textPlainOnly()), new ResourceHttpMessageWriter() ); - this.bufferFactory = bufferFactory; } public MultipartHttpMessageWriter(List> partWriters) { - this(partWriters, new DefaultDataBufferFactory()); - } - - public MultipartHttpMessageWriter(List> partWriters, DataBufferFactory factory) { this.partWriters = partWriters; - this.bufferFactory = factory; } /** @@ -130,12 +120,17 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter - outputMessage.writeWith(generateParts(multiValueMap, boundary))); + return Mono.from(inputStream).flatMap(map -> { + + Flux body = Flux.fromIterable(map.entrySet()) + .concatMap(entry -> encodePartValues(boundary, entry.getKey(), entry.getValue())) + .concatWith(Mono.just(generateLastLine(boundary))); + + return outputMessage.writeWith(body); + }); } /** @@ -146,16 +141,13 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter generateParts(MultiValueMap map, byte[] boundary) { - return Flux.fromIterable(map.entrySet()) - .concatMap(entry -> Flux - .fromIterable(entry.getValue()) - .concatMap(value -> generatePart(entry.getKey(), value, boundary))) - .concatWith(Mono.just(generateLastLine(boundary))); + private Flux encodePartValues(byte[] boundary, String name, List values) { + return Flux.concat(values.stream().map(v -> + encodePart(boundary, name, v)).collect(Collectors.toList())); } @SuppressWarnings("unchecked") - private Flux generatePart(String name, T value, byte[] boundary) { + private Flux encodePart(byte[] boundary, String name, T value) { MultipartHttpOutputMessage outputMessage = new MultipartHttpOutputMessage(this.bufferFactory);