svn commit: r1854601 - /cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/servlet/multipart/MultipartParser.java

[email protected] Fri, 01 Mar 2019 15:51:48 -0000
Newsgroups gmane.text.xml.cocoon.cvs
Message-ID <[email protected]>
Author: cdamioli
Date: Fri Mar  1 15:51:48 2019
New Revision: 1854601

URL: http://svn.apache.org/viewvc?rev=1854601&view=rev
Log:
COCOON-2361 Cannot upload a file with name containing a '=' or a ';'

Modified:
    cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/servlet/multipart/MultipartParser.java

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/servlet/multipart/MultipartParser.java
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/servlet/multipart/MultipartParser.java?rev=1854601&r1=1854600&r2=1854601&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/servlet/multipart/MultipartParser.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/servlet/multipart/MultipartParser.java Fri Mar  1 15:51:48 2019
@@ -385,21 +385,87 @@ public class MultipartParser {
         String hdrline = readln(in);
 
         while (!"".equals(hdrline)) {
-            StringTokenizer tokenizer = new StringTokenizer(hdrline);
+            
+            headers.putAll(readHeaders(hdrline));
 
-            headers.put(tokenizer.nextToken(" :").toLowerCase(),
-                    tokenizer.nextToken(" :;"));
+            hdrline = readln(in);
+        }
 
-            // The extra tokenizer.hasMoreTokens() in headers.put
-            // handles the filename="" case IE6 submits for an empty
-            // upload field.
-            while (tokenizer.hasMoreTokens()) {
-                headers.put(tokenizer.nextToken(" ;=\""),
-                        tokenizer.hasMoreTokens()?tokenizer.nextToken("=\""):"");
-            }
+        return headers;
+    }
+    
+    private Hashtable readHeaders(String hdrline) {
 
-            hdrline = readln(in);
+        Hashtable headers = new Hashtable();
+
+        boolean inValue = false;
+        boolean inFirstName = true;
+        boolean inName = true;
+        boolean inQuotedString = false;
+        
+        String name = null;
+        String value = null;
+        
+        int start = 0;
+        int offset = 0;
+        
+        for (int i = 0; i < hdrline.length(); i++) {
+            
+            char c = hdrline.charAt(i);
+            
+            switch (c) {
+                case ':':
+                case '=':
+                    if (!inQuotedString) {
+                        if (inName) {
+                            name = hdrline.substring(start, start + offset).trim();
+                            
+                            if (inFirstName) {
+                                name = name.toLowerCase();
+                                inFirstName = false;
+                            }
+
+                            inName = false;
+                            inValue = true;
+                            start = i + 1;
+                            offset = 0;
+                        }
+                    }
+                    else {
+                        offset++;
+                    }
+                    break;
+                case ';':
+                    if (!inQuotedString) {
+                        if (inValue) {
+                            value = hdrline.substring(start, start + offset).trim();
+                            headers.put(name, value);
+                            inName = true;
+                            inValue = false;
+                            start = i + 1;
+                            offset = 0;
+                        }
+                    }
+                    else {
+                        offset++;
+                    }
+                    
+                    break;
+                case '"':
+                    inQuotedString = !inQuotedString;
+                    if (inQuotedString) {
+                        start = i + 1;
+                    }
+                    break;
+                default:
+                    offset++;
+                    break;
+            }
         }
+        
+        // last part
+        value = hdrline.substring(start, start + offset).trim();
+        headers.put(name, value);
 
         return headers;
     }