From 2576aa40631b15144ba6c3169bf4a33f612373a4 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 13 Dec 2019 05:46:09 +0000 Subject: [PATCH] ContentDisposition trims charset in filename Backport of c8bce9686f3dca2013aee875b3c86d87aa897662 Closes gh-24112 --- .../org/springframework/http/ContentDisposition.java | 4 ++-- .../springframework/http/ContentDispositionTests.java | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) 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 b0b13aa205d5..93e3bd4cb816 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 static ContentDisposition parse(String 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 @@ private static String decodeHeaderFieldParam(String input) { 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 fd0ec56572b9..f195358f63cb 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 void parseAndIgnoreEmptyParts() { .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