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]