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;
}