Browse Source

Copy headers from part in MultipartBodyBuilder

This commit makes sure that Part.headers() is copied over when adding a
part in the MultipartBodyBuilder.

Closes gh-26410
pull/26432/head
Arjen Poutsma 5 years ago
parent
commit
e537844a09
  1. 10
      spring-web/src/main/java/org/springframework/http/client/MultipartBodyBuilder.java
  2. 8
      spring-web/src/test/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriterTests.java

10
spring-web/src/main/java/org/springframework/http/client/MultipartBodyBuilder.java

@ -30,7 +30,6 @@ import org.springframework.core.io.buffer.DataBuffer; @@ -30,7 +30,6 @@ import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.http.codec.multipart.Part;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
@ -129,13 +128,14 @@ public final class MultipartBodyBuilder { @@ -129,13 +128,14 @@ public final class MultipartBodyBuilder {
Assert.notNull(part, "'part' must not be null");
if (part instanceof Part) {
PartBuilder builder = asyncPart(name, ((Part) part).content(), DataBuffer.class);
Part partObject = (Part) part;
PartBuilder builder = asyncPart(name, partObject.content(), DataBuffer.class);
if (!partObject.headers().isEmpty()) {
builder.headers(headers -> headers.putAll(partObject.headers()));
}
if (contentType != null) {
builder.contentType(contentType);
}
if (part instanceof FilePart) {
builder.filename(((FilePart) part).filename());
}
return builder;
}

8
spring-web/src/test/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriterTests.java

@ -37,6 +37,7 @@ import org.springframework.core.io.buffer.DataBufferUtils; @@ -37,6 +37,7 @@ import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.core.testfixture.io.buffer.AbstractLeakCheckingTests;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.client.MultipartBodyBuilder;
import org.springframework.http.codec.ClientCodecConfigurer;
@ -102,8 +103,12 @@ public class MultipartHttpMessageWriterTests extends AbstractLeakCheckingTests { @@ -102,8 +103,12 @@ public class MultipartHttpMessageWriterTests extends AbstractLeakCheckingTests {
this.bufferFactory.wrap("Cc".getBytes(StandardCharsets.UTF_8))
);
FilePart mockPart = mock(FilePart.class);
HttpHeaders partHeaders = new HttpHeaders();
partHeaders.setContentType(MediaType.TEXT_PLAIN);
partHeaders.setContentDispositionFormData("filePublisher", "file.txt");
partHeaders.add("foo", "bar");
given(mockPart.headers()).willReturn(partHeaders);
given(mockPart.content()).willReturn(bufferPublisher);
given(mockPart.filename()).willReturn("file.txt");
MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();
bodyBuilder.part("name 1", "value 1");
@ -166,6 +171,7 @@ public class MultipartHttpMessageWriterTests extends AbstractLeakCheckingTests { @@ -166,6 +171,7 @@ public class MultipartHttpMessageWriterTests extends AbstractLeakCheckingTests {
part = requestParts.getFirst("filePublisher");
assertThat(part.name()).isEqualTo("filePublisher");
assertThat(part.headers()).containsEntry("foo", Collections.singletonList("bar"));
assertThat(((FilePart) part).filename()).isEqualTo("file.txt");
value = decodeToString(part);
assertThat(value).isEqualTo("AaBbCc");

Loading…
Cancel
Save