ContentDisposition trims charset in filename

Closes gh-24112
This commit is contained in:
Rossen Stoyanchev 2019-12-10 15:38:28 +00:00
parent f180bf7652
commit c8bce9686f
2 changed files with 9 additions and 1 deletions

View File

@ -282,7 +282,7 @@ public final class ContentDisposition {
int idx1 = value.indexOf('\''); int idx1 = value.indexOf('\'');
int idx2 = value.indexOf('\'', idx1 + 1); int idx2 = value.indexOf('\'', idx1 + 1);
if (idx1 != -1 && idx2 != -1) { if (idx1 != -1 && idx2 != -1) {
charset = Charset.forName(value.substring(0, idx1)); charset = Charset.forName(value.substring(0, idx1).trim());
Assert.isTrue(UTF_8.equals(charset) || ISO_8859_1.equals(charset), Assert.isTrue(UTF_8.equals(charset) || ISO_8859_1.equals(charset),
"Charset should be UTF-8 or ISO-8859-1"); "Charset should be UTF-8 or ISO-8859-1");
filename = decodeFilename(value.substring(idx2 + 1), charset); filename = decodeFilename(value.substring(idx2 + 1), charset);

View File

@ -70,6 +70,14 @@ public class ContentDispositionTests {
.build()); .build());
} }
@Test // gh-24112
public void parseEncodedFilenameWithPaddedCharset() {
assertThat(parse("attachment; filename*= UTF-8''some-file.zip"))
.isEqualTo(ContentDisposition.builder("attachment")
.filename("some-file.zip", StandardCharsets.UTF_8)
.build());
}
@Test @Test
public void parseEncodedFilenameWithoutCharset() { public void parseEncodedFilenameWithoutCharset() {
assertThat(parse("form-data; name=\"name\"; filename*=test.txt")) assertThat(parse("form-data; name=\"name\"; filename*=test.txt"))