Skip to content

Commit a56f735

Browse files
committed
Polish
1 parent ac1db16 commit a56f735

File tree

1 file changed

+15
-23
lines changed

1 file changed

+15
-23
lines changed

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

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import java.util.Optional;
2727
import java.util.concurrent.atomic.AtomicBoolean;
2828
import java.util.function.Supplier;
29-
29+
import java.util.stream.Collectors;
3030
import javax.mail.internet.MimeUtility;
3131

3232
import org.reactivestreams.Publisher;
@@ -71,28 +71,18 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter<MultiValueM
7171

7272
private Charset filenameCharset = DEFAULT_CHARSET;
7373

74-
private final DataBufferFactory bufferFactory;
74+
private final DataBufferFactory bufferFactory = new DefaultDataBufferFactory();
7575

7676

7777
public MultipartHttpMessageWriter() {
78-
this(new DefaultDataBufferFactory());
79-
}
80-
81-
public MultipartHttpMessageWriter(DataBufferFactory bufferFactory) {
8278
this.partWriters = Arrays.asList(
8379
new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()),
8480
new ResourceHttpMessageWriter()
8581
);
86-
this.bufferFactory = bufferFactory;
8782
}
8883

8984
public MultipartHttpMessageWriter(List<HttpMessageWriter<?>> partWriters) {
90-
this(partWriters, new DefaultDataBufferFactory());
91-
}
92-
93-
public MultipartHttpMessageWriter(List<HttpMessageWriter<?>> partWriters, DataBufferFactory factory) {
9485
this.partWriters = partWriters;
95-
this.bufferFactory = factory;
9686
}
9787

9888
/**
@@ -130,12 +120,17 @@ public Mono<Void> write(Publisher<? extends MultiValueMap<String, ?>> inputStrea
130120

131121
byte[] boundary = generateMultipartBoundary();
132122

133-
HttpHeaders headers = outputMessage.getHeaders();
134-
headers.setContentType(new MediaType(MediaType.MULTIPART_FORM_DATA,
123+
outputMessage.getHeaders().setContentType(new MediaType("multipart", "form-data",
135124
Collections.singletonMap("boundary", new String(boundary, StandardCharsets.US_ASCII))));
136125

137-
return Mono.from(inputStream).flatMap(multiValueMap ->
138-
outputMessage.writeWith(generateParts(multiValueMap, boundary)));
126+
return Mono.from(inputStream).flatMap(map -> {
127+
128+
Flux<DataBuffer> body = Flux.fromIterable(map.entrySet())
129+
.concatMap(entry -> encodePartValues(boundary, entry.getKey(), entry.getValue()))
130+
.concatWith(Mono.just(generateLastLine(boundary)));
131+
132+
return outputMessage.writeWith(body);
133+
});
139134
}
140135

141136
/**
@@ -146,16 +141,13 @@ protected byte[] generateMultipartBoundary() {
146141
return MimeTypeUtils.generateMultipartBoundary();
147142
}
148143

149-
private Flux<DataBuffer> generateParts(MultiValueMap<String, ?> map, byte[] boundary) {
150-
return Flux.fromIterable(map.entrySet())
151-
.concatMap(entry -> Flux
152-
.fromIterable(entry.getValue())
153-
.concatMap(value -> generatePart(entry.getKey(), value, boundary)))
154-
.concatWith(Mono.just(generateLastLine(boundary)));
144+
private Flux<DataBuffer> encodePartValues(byte[] boundary, String name, List<?> values) {
145+
return Flux.concat(values.stream().map(v ->
146+
encodePart(boundary, name, v)).collect(Collectors.toList()));
155147
}
156148

157149
@SuppressWarnings("unchecked")
158-
private <T> Flux<DataBuffer> generatePart(String name, T value, byte[] boundary) {
150+
private <T> Flux<DataBuffer> encodePart(byte[] boundary, String name, T value) {
159151

160152
MultipartHttpOutputMessage outputMessage = new MultipartHttpOutputMessage(this.bufferFactory);
161153

0 commit comments

Comments
 (0)