You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2016/07/14 07:58:34 UTC

cxf git commit: [CXF-6967] Making Content-Disposition filename parameter case-insensitive, patch from Kevin Osborn applied with thanks, This closes #147

Repository: cxf
Updated Branches:
  refs/heads/master ef4fe2d84 -> 01deb3311


[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/01deb331
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/01deb331
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/01deb331

Branch: refs/heads/master
Commit: 01deb3311af0f25406e499196df23f2224a9630e
Parents: ef4fe2d
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Thu Jul 14 10:58:16 2016 +0300
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Thu Jul 14 10:58:16 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/01deb331/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/01deb331/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("\u4e16\u754c\u30fc\u30d5\u30a1\u30a4\u30eb.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("\u0434\u0435\u043c\u043e-\u0441\u0435\u0440\u0432\u0438\u0441.zip",
@@ -86,4 +110,3 @@ public class AttachmentUtilTest extends Assert {
     }
 
 }
-