From ce1ae2f1b21311fc62f8936c2fefc61cda295839 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Fri, 8 Jan 2021 14:03:58 +0100 Subject: [PATCH] Only write non-default charset in FormHttpMessageConverter 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'. See gh-25885 Closes gh-26290 --- .../converter/FormHttpMessageConverter.java | 5 +++- .../FormHttpMessageConverterTests.java | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java index 090ab26b428..8458ba1d651 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java @@ -475,7 +475,10 @@ public class FormHttpMessageConverter implements HttpMessageConverterfoo"); } + @Test + public void writeMultipartCharset() throws Exception { + MultiValueMap parts = new LinkedMultiValueMap<>(); + Resource logo = new ClassPathResource("/org/springframework/http/converter/logo.jpg"); + parts.add("logo", logo); + + MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); + this.converter.write(parts, MULTIPART_FORM_DATA, outputMessage); + + MediaType contentType = outputMessage.getHeaders().getContentType(); + Map parameters = contentType.getParameters(); + assertThat(parameters).containsOnlyKeys("boundary"); + + this.converter.setCharset(StandardCharsets.ISO_8859_1); + + outputMessage = new MockHttpOutputMessage(); + this.converter.write(parts, MULTIPART_FORM_DATA, outputMessage); + + parameters = outputMessage.getHeaders().getContentType().getParameters(); + assertThat(parameters).containsOnlyKeys("boundary", "charset"); + assertThat(parameters).containsEntry("charset", "ISO-8859-1"); + } + private void assertCanRead(MediaType mediaType) { assertCanRead(MultiValueMap.class, mediaType); }