Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 2199A200B44 for ; Thu, 14 Jul 2016 09:59:51 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 2017D160A63; Thu, 14 Jul 2016 07:59:51 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 438CF160A52 for ; Thu, 14 Jul 2016 09:59:50 +0200 (CEST) Received: (qmail 62378 invoked by uid 500); 14 Jul 2016 07:59:49 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 62369 invoked by uid 99); 14 Jul 2016 07:59:49 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 14 Jul 2016 07:59:49 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 5D33AE383A; Thu, 14 Jul 2016 07:59:49 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: sergeyb@apache.org To: commits@cxf.apache.org Message-Id: <428f8d03e13e4b80b708b9dd886c16dc@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: cxf git commit: [CXF-6967] Making Content-Disposition filename parameter case-insensitive, patch from Kevin Osborn applied with thanks, This closes #147 Date: Thu, 14 Jul 2016 07:59:49 +0000 (UTC) archived-at: Thu, 14 Jul 2016 07:59:51 -0000 Repository: cxf Updated Branches: refs/heads/3.1.x-fixes caae5fb26 -> 4e0c1514f [CXF-6967] Making Content-Disposition filename parameter case-insensitive, patch from Kevin Osborn applied with thanks, This closes #147 Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/4e0c1514 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/4e0c1514 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/4e0c1514 Branch: refs/heads/3.1.x-fixes Commit: 4e0c1514fd2e46ee076d0724e798dc3b8600d391 Parents: caae5fb Author: Sergey Beryozkin Authored: Thu Jul 14 10:58:16 2016 +0300 Committer: Sergey Beryozkin Committed: Thu Jul 14 10:59:35 2016 +0300 ---------------------------------------------------------------------- .../cxf/attachment/ContentDisposition.java | 12 ++-- .../cxf/attachment/AttachmentUtilTest.java | 59 ++++++++++++++------ 2 files changed, 47 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/4e0c1514/core/src/main/java/org/apache/cxf/attachment/ContentDisposition.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/cxf/attachment/ContentDisposition.java b/core/src/main/java/org/apache/cxf/attachment/ContentDisposition.java index f7cfd97..22b5daa 100644 --- a/core/src/main/java/org/apache/cxf/attachment/ContentDisposition.java +++ b/core/src/main/java/org/apache/cxf/attachment/ContentDisposition.java @@ -33,7 +33,7 @@ public class ContentDisposition { Pattern.compile(CD_HEADER_PARAMS_EXPRESSION); private static final String CD_HEADER_EXT_PARAMS_EXPRESSION = - "(UTF-8|ISO-8859-1)''((?:%[0-9a-f]{2}|\\S)+)"; + "(?i)(UTF-8|ISO-8859-1)''((?:%[0-9a-f]{2}|\\S)+)"; private static final Pattern CD_HEADER_EXT_PARAMS_PATTERN = Pattern.compile(CD_HEADER_EXT_PARAMS_EXPRESSION); private static final Pattern CODEPOINT_ENCODED_VALUE_PATTERN = Pattern.compile("&#[0-9]{4};|\\S"); @@ -60,7 +60,7 @@ public class ContentDisposition { String paramName = pair[0].trim(); String paramValue = pair.length == 2 ? pair[1].trim().replace("\"", "") : ""; // filename* looks like the only CD param that is human readable - // and worthy of the extended encoding support. Other parameters + // and worthy of the extended encoding support. Other parameters // can be supported if needed, see the complete list below /* http://www.iana.org/assignments/cont-disp/cont-disp.xhtml#cont-disp-2 @@ -74,7 +74,7 @@ public class ContentDisposition { voice type or use of audio content [RFC2421] handling whether or not processing is required [RFC3204] */ - if ("filename*".equals(paramName)) { + if ("filename*".equalsIgnoreCase(paramName)) { // try to decode the value if it matches the spec try { Matcher matcher = CD_HEADER_EXT_PARAMS_PATTERN.matcher(paramValue); @@ -87,7 +87,7 @@ public class ContentDisposition { } catch (UnsupportedEncodingException e) { // would be odd not to support UTF-8 or 8859-1 } - } else if ("filename".equals(paramName) && paramValue.contains("&#")) { + } else if ("filename".equalsIgnoreCase(paramName) && paramValue.contains("&#")) { Matcher matcher = CODEPOINT_ENCODED_VALUE_PATTERN.matcher(paramValue); StringBuilder sb = new StringBuilder(); while (matcher.find()) { @@ -103,7 +103,7 @@ public class ContentDisposition { paramValue = sb.toString(); } } - params.put(paramName, paramValue); + params.put(paramName.toLowerCase(), paramValue); } if (extendedFilename != null) { params.put("filename", extendedFilename); @@ -117,7 +117,7 @@ public class ContentDisposition { public String getFilename() { return params.get("filename"); } - + public String getParameter(String name) { return params.get(name); } http://git-wip-us.apache.org/repos/asf/cxf/blob/4e0c1514/core/src/test/java/org/apache/cxf/attachment/AttachmentUtilTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/cxf/attachment/AttachmentUtilTest.java b/core/src/test/java/org/apache/cxf/attachment/AttachmentUtilTest.java index 0c9f17d..a9d3c90 100644 --- a/core/src/test/java/org/apache/cxf/attachment/AttachmentUtilTest.java +++ b/core/src/test/java/org/apache/cxf/attachment/AttachmentUtilTest.java @@ -22,62 +22,86 @@ import org.junit.Assert; import org.junit.Test; public class AttachmentUtilTest extends Assert { - + @Test public void testContendDispositionFileNameNoQuotes() { - assertEquals("a.txt", + assertEquals("a.txt", AttachmentUtil.getContentDispositionFileName("form-data; filename=a.txt")); } - + @Test public void testContendDispositionFileNameNoQuotesAndType() { - assertEquals("a.txt", + assertEquals("a.txt", AttachmentUtil.getContentDispositionFileName("filename=a.txt")); } - + @Test public void testContendDispositionFileNameNoQuotesAndType2() { - assertEquals("a.txt", + assertEquals("a.txt", AttachmentUtil.getContentDispositionFileName("name=files; filename=a.txt")); } - + @Test public void testContendDispositionFileNameSpacesNoQuotes() { - assertEquals("a.txt", + assertEquals("a.txt", AttachmentUtil.getContentDispositionFileName("form-data; filename = a.txt")); } - + @Test public void testContendDispositionFileNameWithQuotes() { - assertEquals("a.txt", + assertEquals("a.txt", AttachmentUtil.getContentDispositionFileName("form-data; filename=\"a.txt\"")); } - + @Test public void testContendDispositionFileNameWithQuotesAndSemicolon() { - assertEquals("a;txt", + assertEquals("a;txt", AttachmentUtil.getContentDispositionFileName("form-data; filename=\"a;txt\"")); } - + @Test public void testContendDispositionFileNameWithQuotesAndSemicolon2() { - assertEquals("a;txt", + assertEquals("a;txt", AttachmentUtil.getContentDispositionFileName("filename=\"a;txt\"")); } - + @Test public void testContendDispositionFileNameWithQuotesAndSemicolon3() { - assertEquals("a;txt", + assertEquals("a;txt", AttachmentUtil.getContentDispositionFileName("name=\"a\";filename=\"a;txt\"")); } @Test + public void testContentDispositionAsterickMode() { + assertEquals("a b.txt", + AttachmentUtil.getContentDispositionFileName("filename=\"bad.txt\"; filename*=UTF-8''a%20b.txt")); + } + + @Test + public void testContentDispositionAsterickModeLowercase() { + assertEquals("a b.txt", + AttachmentUtil.getContentDispositionFileName("filename*=utf-8''a%20b.txt")); + } + + @Test + public void testContentDispositionAsterickModeFnUppercase() { + assertEquals("a b.txt", + AttachmentUtil.getContentDispositionFileName("FILENAME*=utf-8''a%20b.txt")); + } + + @Test + public void testContentDispositionFnUppercase() { + assertEquals("a b.txt", + AttachmentUtil.getContentDispositionFileName("FILENAME=\"a b.txt\"")); + } + + @Test public void testContendDispositionFileNameKanjiChars() { assertEquals("世界ーファイル.txt", AttachmentUtil.getContentDispositionFileName( "filename*=UTF-8''%e4%b8%96%e7%95%8c%e3%83%bc%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab.txt")); } - + @Test public void testContendDispositionFileNameNoRfc5987() { assertEquals("демо-сервис.zip", @@ -86,4 +110,3 @@ public class AttachmentUtilTest extends Assert { } } -