Browse Source

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
pull/26366/head
Arjen Poutsma 5 years ago
parent
commit
ce1ae2f1b2
  1. 5
      spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java
  2. 23
      spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java

5
spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java

@ -475,7 +475,10 @@ public class FormHttpMessageConverter implements HttpMessageConverter<MultiValue @@ -475,7 +475,10 @@ public class FormHttpMessageConverter implements HttpMessageConverter<MultiValue
byte[] boundary = generateMultipartBoundary();
if (!isFilenameCharsetSet()) {
parameters.put("charset", this.charset.name());
if (!this.charset.equals(StandardCharsets.UTF_8) &&
!this.charset.equals(StandardCharsets.US_ASCII)) {
parameters.put("charset", this.charset.name());
}
}
parameters.put("boundary", new String(boundary, StandardCharsets.US_ASCII));

23
spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java

@ -273,6 +273,29 @@ public class FormHttpMessageConverterTests { @@ -273,6 +273,29 @@ public class FormHttpMessageConverterTests {
.endsWith("><string>foo</string></MyBean>");
}
@Test
public void writeMultipartCharset() throws Exception {
MultiValueMap<String, Object> 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<String, String> 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);
}

Loading…
Cancel
Save