From dea2029e94108f09e8b932efec2160d62d6dadb5 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Mon, 23 Nov 2020 16:43:41 +0100 Subject: [PATCH] Only write non-default charset in MultipartWriterSupport This commit only writes the 'charset' parameter in the written headers if it is non-default (not UTF-8), since RFC7578 states that the only allowed parameter is 'boundary'. Closes gh-25885 --- .../http/codec/multipart/MultipartHttpMessageWriter.java | 4 +++- .../http/codec/multipart/MultipartWriterSupport.java | 6 +++++- .../codec/multipart/MultipartHttpMessageWriterTests.java | 2 +- 3 files changed, 9 insertions(+), 3 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 62907ec3e2..50e9a264d1 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 @@ -149,7 +149,9 @@ public class MultipartHttpMessageWriter extends MultipartWriterSupport /** * Set the character set to use for part headers such as * "Content-Disposition" (and its filename parameter). - *

By default this is set to "UTF-8". + *

By default this is set to "UTF-8". If changed from this default, + * the "Content-Type" header will have a "charset" parameter that specifies + * the character set used. */ public void setCharset(Charset charset) { Assert.notNull(charset, "Charset must not be null"); diff --git a/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartWriterSupport.java b/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartWriterSupport.java index d7cf518121..0ddae070e0 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartWriterSupport.java +++ b/spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartWriterSupport.java @@ -102,7 +102,11 @@ public class MultipartWriterSupport extends LoggingCodecSupport { params.putAll(mediaType.getParameters()); } params.put("boundary", new String(boundary, StandardCharsets.US_ASCII)); - params.put("charset", getCharset().name()); + Charset charset = getCharset(); + if (!charset.equals(StandardCharsets.UTF_8) && + !charset.equals(StandardCharsets.US_ASCII) ) { + params.put("charset", getCharset().name()); + } mediaType = (mediaType != null ? mediaType : MediaType.MULTIPART_FORM_DATA); mediaType = new MediaType(mediaType, params); diff --git a/spring-web/src/test/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriterTests.java b/spring-web/src/test/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriterTests.java index a412102f9c..167b300fd3 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriterTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriterTests.java @@ -190,7 +190,7 @@ public class MultipartHttpMessageWriterTests extends AbstractLeakCheckingTests { assertThat(contentType.isCompatibleWith(mediaType)).isTrue(); assertThat(contentType.getParameter("type")).isEqualTo("foo"); assertThat(contentType.getParameter("boundary")).isNotEmpty(); - assertThat(contentType.getParameter("charset")).isEqualTo("UTF-8"); + assertThat(contentType.getParameter("charset")).isNull(); MultiValueMap requestParts = parse(this.response, hints); assertThat(requestParts.size()).isEqualTo(2);