Skip to content

Commit ce1ae2f

Browse files
committed
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
1 parent 69ce7d3 commit ce1ae2f

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,10 @@ private void writeMultipart(
475475

476476
byte[] boundary = generateMultipartBoundary();
477477
if (!isFilenameCharsetSet()) {
478-
parameters.put("charset", this.charset.name());
478+
if (!this.charset.equals(StandardCharsets.UTF_8) &&
479+
!this.charset.equals(StandardCharsets.US_ASCII)) {
480+
parameters.put("charset", this.charset.name());
481+
}
479482
}
480483
parameters.put("boundary", new String(boundary, StandardCharsets.US_ASCII));
481484

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,29 @@ public void writeMultipartOrder() throws Exception {
273273
.endsWith("><string>foo</string></MyBean>");
274274
}
275275

276+
@Test
277+
public void writeMultipartCharset() throws Exception {
278+
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
279+
Resource logo = new ClassPathResource("/org/springframework/http/converter/logo.jpg");
280+
parts.add("logo", logo);
281+
282+
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
283+
this.converter.write(parts, MULTIPART_FORM_DATA, outputMessage);
284+
285+
MediaType contentType = outputMessage.getHeaders().getContentType();
286+
Map<String, String> parameters = contentType.getParameters();
287+
assertThat(parameters).containsOnlyKeys("boundary");
288+
289+
this.converter.setCharset(StandardCharsets.ISO_8859_1);
290+
291+
outputMessage = new MockHttpOutputMessage();
292+
this.converter.write(parts, MULTIPART_FORM_DATA, outputMessage);
293+
294+
parameters = outputMessage.getHeaders().getContentType().getParameters();
295+
assertThat(parameters).containsOnlyKeys("boundary", "charset");
296+
assertThat(parameters).containsEntry("charset", "ISO-8859-1");
297+
}
298+
276299
private void assertCanRead(MediaType mediaType) {
277300
assertCanRead(MultiValueMap.class, mediaType);
278301
}

0 commit comments

Comments
 (0)