Browse Source

Encode non-printable character in Content-Disposition parameter

Prior to this commit, the "filename" parameter value for the
"Content-Disposition" header would contain non-printable characters,
causing parsing issues for HTTP clients.
This commit ensures that all non-printable characters are encoded.

Fixes gh-35034
pull/35405/head
Brian Clozel 6 months ago
parent
commit
f0e7b42704
  1. 1
      spring-web/src/main/java/org/springframework/http/ContentDisposition.java
  2. 7
      spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java

1
spring-web/src/main/java/org/springframework/http/ContentDisposition.java

@ -68,6 +68,7 @@ public final class ContentDisposition {
for (int i=33; i<= 126; i++) { for (int i=33; i<= 126; i++) {
PRINTABLE.set(i); PRINTABLE.set(i);
} }
PRINTABLE.set(34, false); // "
PRINTABLE.set(61, false); // = PRINTABLE.set(61, false); // =
PRINTABLE.set(63, false); // ? PRINTABLE.set(63, false); // ?
PRINTABLE.set(95, false); // _ PRINTABLE.set(95, false); // _

7
spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java

@ -313,6 +313,13 @@ class ContentDispositionTests {
tester.accept("foo.txt\\\\\\", "foo.txt\\\\\\\\\\\\"); tester.accept("foo.txt\\\\\\", "foo.txt\\\\\\\\\\\\");
} }
@Test
void formatWithUtf8FilenameWithQuotes() {
String filename = "\"中文.txt";
assertThat(ContentDisposition.formData().filename(filename, StandardCharsets.UTF_8).build().toString())
.isEqualTo("form-data; filename=\"=?UTF-8?Q?=22=E4=B8=AD=E6=96=87.txt?=\"; filename*=UTF-8''%22%E4%B8%AD%E6%96%87.txt");
}
@Test @Test
void formatWithEncodedFilenameUsingInvalidCharset() { void formatWithEncodedFilenameUsingInvalidCharset() {
assertThatIllegalArgumentException().isThrownBy(() -> assertThatIllegalArgumentException().isThrownBy(() ->

Loading…
Cancel
Save