Author: jochen
Date: Sun Aug  6 17:15:56 2006
New Revision: 429217

URL: http://svn.apache.org/viewvc?rev=429217&view=rev
Log:
Added support for header continuation lines.
PR: FILEUPLOAD-111
Submitted-by: Amichai Rothman, [EMAIL PROTECTED]

Modified:
    
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java
    
jakarta/commons/proper/fileupload/trunk/src/test/org/apache/commons/fileupload/ServletFileUploadTest.java
    jakarta/commons/proper/fileupload/trunk/xdocs/changes.xml

Modified: 
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java?rev=429217&r1=429216&r2=429217&view=diff
==============================================================================
--- 
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java
 (original)
+++ 
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java
 Sun Aug  6 17:15:56 2006
@@ -430,43 +430,72 @@
      * @return A <code>Map</code> containing the parsed HTTP request headers.
      */
     protected Map /* String, String */ parseHeaders(String headerPart) {
-        Map headers = new HashMap();
+       final int len = headerPart.length();
+       Map headers = new HashMap();
         int start = 0;
-        int end = 0;
         for(;;) {
-               int offset = headerPart.indexOf('\r', end);
-               if (offset == -1  ||  offset+1 >= headerPart.length()) {
-                       throw new IllegalStateException("Expected headers to be 
terminated by an empty line.");
-               }
-               if (headerPart.charAt(offset+1) != '\n') {
-                       end = offset+1;
-               } else if (offset == start) {
+               int end = parseEndOfLine(headerPart, start);
+               if (start == end) {
                        break;
-               } else {
-               String header = headerPart.substring(start, offset);
-               start = end = offset+2;
-                if (header.indexOf(':') == -1) {
-                    // This header line is malformed, skip it.
-                    continue;
-                }
-                String headerName = header.substring(0, header.indexOf(':'))
-                    .trim().toLowerCase();
-                String headerValue =
-                    header.substring(header.indexOf(':') + 1).trim();
-                if (getHeader(headers, headerName) != null) {
-                    // More that one heder of that name exists,
-                    // append to the list.
-                    headers.put(headerName,
-                                getHeader(headers, headerName) + ','
-                                    + headerValue);
-                } else {
-                    headers.put(headerName, headerValue);
-                }
                }
+               String header = headerPart.substring(start, end);
+               start = end+2;
+               while (start < len) {
+                       int nonWs = start;
+                       while (nonWs < len) {
+                               char c = headerPart.charAt(nonWs);
+                               if (c != ' '  &&  c != '\t') {
+                                       break;
+                               }
+                               ++nonWs;
+                       }
+                       if (nonWs == start) {
+                               break;
+                       }
+                       // Continuation line found
+                       end = parseEndOfLine(headerPart, nonWs);
+                       header += " " + headerPart.substring(nonWs, end);
+                       start = end+2;
+               }
+               parseHeaderLine(headers, header);
         }
         return headers;
     }
 
+    private int parseEndOfLine(String headerPart, int end) {
+       int index = end;
+       for (;;) {
+               int offset = headerPart.indexOf('\r', index);
+               if (offset == -1  ||  offset+1 >= headerPart.length()) {
+                       throw new IllegalStateException("Expected headers to be 
terminated by an empty line.");
+               }
+               if (headerPart.charAt(offset+1) == '\n') {
+                       return offset;
+               }
+               index = offset+1;
+       }
+    }
+    
+    private void parseHeaderLine(Map headers, String header) {
+       final int colonOffset = header.indexOf(':');
+       if (colonOffset == -1) {
+            // This header line is malformed, skip it.
+            return;
+        }
+        String headerName = header.substring(0, colonOffset)
+            .trim().toLowerCase();
+        String headerValue =
+            header.substring(header.indexOf(':') + 1).trim();
+        if (getHeader(headers, headerName) != null) {
+            // More that one heder of that name exists,
+            // append to the list.
+            headers.put(headerName,
+                        getHeader(headers, headerName) + ','
+                            + headerValue);
+        } else {
+            headers.put(headerName, headerValue);
+        }
+    }
 
     /**
      * Returns the header with the specified name from the supplied map. The

Modified: 
jakarta/commons/proper/fileupload/trunk/src/test/org/apache/commons/fileupload/ServletFileUploadTest.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/trunk/src/test/org/apache/commons/fileupload/ServletFileUploadTest.java?rev=429217&r1=429216&r2=429217&view=diff
==============================================================================
--- 
jakarta/commons/proper/fileupload/trunk/src/test/org/apache/commons/fileupload/ServletFileUploadTest.java
 (original)
+++ 
jakarta/commons/proper/fileupload/trunk/src/test/org/apache/commons/fileupload/ServletFileUploadTest.java
 Sun Aug  6 17:15:56 2006
@@ -249,4 +249,52 @@
         assertEquals("file2.gif", item2.getName());
         assertEquals("...contents of file2.gif...", new String(item2.get()));
     }
+
+    public void testFoldedHeaders()
+               throws IOException, FileUploadException {
+       List fileItems = parseUpload("-----1234\r\n" +
+                       "Content-Disposition: form-data; name=\"file\"; 
filename=\"foo.tab\"\r\n" +
+                       "Content-Type: text/whatever\r\n" +
+                       "\r\n" +
+                       "This is the content of the file\n" +
+                       "\r\n" +
+                       "-----1234\r\n" +
+                       "Content-Disposition: form-data; \r\n" +
+                       "\tname=\"field\"\r\n" +
+                       "\r\n" +
+                       "fieldValue\r\n" +
+                       "-----1234\r\n" +
+                       "Content-Disposition: form-data;\r\n" +
+                       "     name=\"multi\"\r\n" +
+                       "\r\n" +
+                       "value1\r\n" +
+                       "-----1234\r\n" +
+                       "Content-Disposition: form-data; name=\"multi\"\r\n" +
+                       "\r\n" +
+                       "value2\r\n" +
+                       "-----1234--\r\n");
+       assertEquals(4, fileItems.size());
+
+       FileItem file = (FileItem) fileItems.get(0);
+       assertEquals("file", file.getFieldName());
+       assertFalse(file.isFormField());
+       assertEquals("This is the content of the file\n", file.getString());
+       assertEquals("text/whatever", file.getContentType());
+       assertEquals("foo.tab", file.getName());
+
+       FileItem field = (FileItem) fileItems.get(1);
+       assertEquals("field", field.getFieldName());
+       assertTrue(field.isFormField());
+       assertEquals("fieldValue", field.getString());
+
+       FileItem multi0 = (FileItem) fileItems.get(2);
+       assertEquals("multi", multi0.getFieldName());
+       assertTrue(multi0.isFormField());
+       assertEquals("value1", multi0.getString());
+
+       FileItem multi1 = (FileItem) fileItems.get(3);
+       assertEquals("multi", multi1.getFieldName());
+       assertTrue(multi1.isFormField());
+       assertEquals("value2", multi1.getString());
+    }
 }

Modified: jakarta/commons/proper/fileupload/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/trunk/xdocs/changes.xml?rev=429217&r1=429216&r2=429217&view=diff
==============================================================================
--- jakarta/commons/proper/fileupload/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/fileupload/trunk/xdocs/changes.xml Sun Aug  6 
17:15:56 2006
@@ -66,6 +66,11 @@
         progress bar.
       </action>
 
+      <action dev="jochen" type="add" issue="FILEUPLOAD-111"
+          due-to="Amichai Rothman" due-to-email="[EMAIL PROTECTED]">
+        Added support for header continuation lines.
+      </action>
+
        </release>
 
     <release version="1.1.1" date="2006-06-08" description="Bugfix release">



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to