From 93a522f3366b1e524863104b32c1cf73acf37bf3 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 5 Jan 2018 13:59:14 -0500 Subject: [PATCH] Fix regression in BodyInserters with multipart data The issue was introduced very recently with commit #7035ee but never released. Issue: SPR-16350 --- .../web/reactive/function/BodyInserters.java | 4 ++- .../reactive/function/BodyInsertersTests.java | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java index 225db83deb..6c0ff7882b 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java @@ -479,7 +479,9 @@ public abstract class BodyInserters { public MultipartInserter with(MultiValueMap values) { Assert.notNull(values, "'values' must not be null"); for (Map.Entry> entry : values.entrySet()) { - this.builder.part(entry.getKey(), entry.getValue()); + for (Object value : entry.getValue()) { + this.builder.part(entry.getKey(), value); + } } return this; } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyInsertersTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyInsertersTests.java index ba46c35a4f..71bb608044 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyInsertersTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyInsertersTests.java @@ -21,6 +21,7 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -64,6 +65,7 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import static org.springframework.http.codec.json.Jackson2CodecSupport.JSON_VIEW_HINT; @@ -320,6 +322,35 @@ public class BodyInsertersTests { } + @Test // SPR-16350 + public void fromMultipartDataWithMultipleValues() { + MultiValueMap map = new LinkedMultiValueMap<>(); + map.put("name", Arrays.asList("value1", "value2")); + BodyInserters.FormInserter inserter = BodyInserters.fromMultipartData(map); + + MockClientHttpRequest request = new MockClientHttpRequest(HttpMethod.GET, URI.create("http://example.com")); + Mono result = inserter.insert(request, this.context); + StepVerifier.create(result).expectComplete().verify(); + + StepVerifier.create(request.getBody().reduce(DataBuffer::write)) + .consumeNextWith(dataBuffer -> { + byte[] resultBytes = new byte[dataBuffer.readableByteCount()]; + dataBuffer.read(resultBytes); + DataBufferUtils.release(dataBuffer); + String content = new String(resultBytes, StandardCharsets.UTF_8); + assertThat(content, containsString("Content-Disposition: form-data; name=\"name\"\r\n" + + "Content-Type: text/plain;charset=UTF-8\r\n" + + "\r\n" + + "value1")); + assertThat(content, containsString("Content-Disposition: form-data; name=\"name\"\r\n" + + "Content-Type: text/plain;charset=UTF-8\r\n" + + "\r\n" + + "value2")); + }) + .expectComplete() + .verify(); + } + @Test public void ofDataBuffers() throws Exception { DefaultDataBufferFactory factory = new DefaultDataBufferFactory();