You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2004/03/11 16:32:41 UTC
cvs commit: cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart MultipartParser.java
sylvain 2004/03/11 07:32:41
Modified: src/java/org/apache/cocoon/servlet/multipart
MultipartParser.java
Log:
Ensure that correct encoding is used to parse headers and values (problem revealed by filenames with accented letters)
Revision Changes Path
1.7 +14 -12 cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/MultipartParser.java
Index: MultipartParser.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/MultipartParser.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- MultipartParser.java 5 Mar 2004 13:02:58 -0000 1.6
+++ MultipartParser.java 11 Mar 2004 15:32:41 -0000 1.7
@@ -30,6 +30,8 @@
import javax.servlet.http.HttpServletRequest;
+import org.apache.avalon.excalibur.io.IOUtil;
+
/**
* This class is used to implement a multipart request wrapper.
* It will parse the http post stream and and fill it's hashtable with values.
@@ -96,7 +98,6 @@
}
this.parts = new Hashtable();
-
BufferedInputStream bufferedStream = new BufferedInputStream(requestStream);
PushbackInputStream pushbackStream = new PushbackInputStream(bufferedStream, MAX_BOUNDARY_SIZE);
TokenStream stream = new TokenStream(pushbackStream);
@@ -255,14 +256,14 @@
private void parseInlinePart(TokenStream in, Hashtable headers)
throws IOException {
- byte[] buf = new byte[INLINE_BUFFER_SIZE];
- StringBuffer value = new StringBuffer();
+ // Buffer incoming bytes for proper string decoding (there can be multibyte chars)
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
while (in.getState() == TokenStream.STATE_READING) {
- int read = in.read(buf);
- value.append(new String(buf, 0, read, this.characterEncoding));
+ int c = in.read();
+ if (c != -1) bos.write(c);
}
-
+
String field = (String) headers.get("name");
Vector v = (Vector) this.parts.get(field);
@@ -271,7 +272,7 @@
this.parts.put(field, v);
}
- v.add(value.toString());
+ v.add(new String(bos.toByteArray(), this.characterEncoding));
}
/**
@@ -335,12 +336,13 @@
* @throws IOException
*/
private String readln(TokenStream in) throws IOException {
-
- StringBuffer out = new StringBuffer();
+
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
int b = in.read();
while ((b != -1) && (b != '\r')) {
- out.append((char) b);
+ bos.write(b);
b = in.read();
}
@@ -348,6 +350,6 @@
in.read(); // read '\n'
}
- return out.toString();
+ return new String(bos.toByteArray(), this.characterEncoding);
}
}