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]