Skip to content

Commit 93a522f

Browse files
committed
Fix regression in BodyInserters with multipart data
The issue was introduced very recently with commit #7035ee but never released. Issue: SPR-16350
1 parent 542de82 commit 93a522f

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,9 @@ public MultipartInserter with(String key, @Nullable Object value) {
479479
public MultipartInserter with(MultiValueMap<String, Object> values) {
480480
Assert.notNull(values, "'values' must not be null");
481481
for (Map.Entry<String, List<Object>> entry : values.entrySet()) {
482-
this.builder.part(entry.getKey(), entry.getValue());
482+
for (Object value : entry.getValue()) {
483+
this.builder.part(entry.getKey(), value);
484+
}
483485
}
484486
return this;
485487
}

spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyInsertersTests.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.nio.charset.StandardCharsets;
2222
import java.nio.file.Files;
2323
import java.util.ArrayList;
24+
import java.util.Arrays;
2425
import java.util.Collections;
2526
import java.util.HashMap;
2627
import java.util.List;
@@ -64,6 +65,7 @@
6465
import org.springframework.util.MultiValueMap;
6566

6667
import static java.nio.charset.StandardCharsets.UTF_8;
68+
import static org.hamcrest.Matchers.*;
6769
import static org.junit.Assert.*;
6870
import static org.springframework.http.codec.json.Jackson2CodecSupport.JSON_VIEW_HINT;
6971

@@ -320,6 +322,35 @@ public void fromMultipartData() throws Exception {
320322

321323
}
322324

325+
@Test // SPR-16350
326+
public void fromMultipartDataWithMultipleValues() {
327+
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
328+
map.put("name", Arrays.asList("value1", "value2"));
329+
BodyInserters.FormInserter<Object> inserter = BodyInserters.fromMultipartData(map);
330+
331+
MockClientHttpRequest request = new MockClientHttpRequest(HttpMethod.GET, URI.create("http://example.com"));
332+
Mono<Void> result = inserter.insert(request, this.context);
333+
StepVerifier.create(result).expectComplete().verify();
334+
335+
StepVerifier.create(request.getBody().reduce(DataBuffer::write))
336+
.consumeNextWith(dataBuffer -> {
337+
byte[] resultBytes = new byte[dataBuffer.readableByteCount()];
338+
dataBuffer.read(resultBytes);
339+
DataBufferUtils.release(dataBuffer);
340+
String content = new String(resultBytes, StandardCharsets.UTF_8);
341+
assertThat(content, containsString("Content-Disposition: form-data; name=\"name\"\r\n" +
342+
"Content-Type: text/plain;charset=UTF-8\r\n" +
343+
"\r\n" +
344+
"value1"));
345+
assertThat(content, containsString("Content-Disposition: form-data; name=\"name\"\r\n" +
346+
"Content-Type: text/plain;charset=UTF-8\r\n" +
347+
"\r\n" +
348+
"value2"));
349+
})
350+
.expectComplete()
351+
.verify();
352+
}
353+
323354
@Test
324355
public void ofDataBuffers() throws Exception {
325356
DefaultDataBufferFactory factory = new DefaultDataBufferFactory();

0 commit comments

Comments
 (0)