diff --git a/spring-web/src/main/java/org/springframework/http/ContentDisposition.java b/spring-web/src/main/java/org/springframework/http/ContentDisposition.java index b0b13aa205..93e3bd4cb8 100644 --- a/spring-web/src/main/java/org/springframework/http/ContentDisposition.java +++ b/spring-web/src/main/java/org/springframework/http/ContentDisposition.java @@ -277,7 +277,7 @@ public final class ContentDisposition { } else if (attribute.equals("filename*") ) { filename = decodeHeaderFieldParam(value); - charset = Charset.forName(value.substring(0, value.indexOf('\''))); + charset = Charset.forName(value.substring(0, value.indexOf('\'')).trim()); Assert.isTrue(UTF_8.equals(charset) || ISO_8859_1.equals(charset), "Charset should be UTF-8 or ISO-8859-1"); } @@ -371,7 +371,7 @@ public final class ContentDisposition { if (firstQuoteIndex == -1 || secondQuoteIndex == -1) { return input; } - Charset charset = Charset.forName(input.substring(0, firstQuoteIndex)); + Charset charset = Charset.forName(input.substring(0, firstQuoteIndex).trim()); Assert.isTrue(UTF_8.equals(charset) || ISO_8859_1.equals(charset), "Charset should be UTF-8 or ISO-8859-1"); byte[] value = input.substring(secondQuoteIndex + 1, input.length()).getBytes(charset); diff --git a/spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java b/spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java index fd0ec56572..f195358f63 100644 --- a/spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java +++ b/spring-web/src/test/java/org/springframework/http/ContentDispositionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,6 +71,14 @@ public class ContentDispositionTests { .name("foo").filename("foo.txt").size(123L).build(), disposition); } + @Test // gh-24112 + public void parseEncodedFilenameWithPaddedCharset() { + ContentDisposition disposition = ContentDisposition + .parse("attachment; filename*= UTF-8''some-file.zip"); + assertEquals(ContentDisposition.builder("attachment") + .filename("some-file.zip", StandardCharsets.UTF_8).build(), disposition); + } + @Test public void parseEncodedFilename() { ContentDisposition disposition = ContentDisposition