diff options
author | Jan Bartel | 2013-07-04 01:10:46 +0000 |
---|---|---|
committer | Jan Bartel | 2013-07-04 01:11:44 +0000 |
commit | 091a4195686ad6b429d7170990e97a290d3a24bf (patch) | |
tree | 3dfef59099d52898610758d9ce32a0e977af8bf6 | |
parent | aa1aae182af1034edd4e895a5e1fcb8e2f47abb1 (diff) | |
download | org.eclipse.jetty.project-091a4195686ad6b429d7170990e97a290d3a24bf.tar.gz org.eclipse.jetty.project-091a4195686ad6b429d7170990e97a290d3a24bf.tar.xz org.eclipse.jetty.project-091a4195686ad6b429d7170990e97a290d3a24bf.zip |
411755 MultiPartInputStreamParser fails on base64 encoded content
-rw-r--r-- | jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java | 24 | ||||
-rw-r--r-- | jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java | 29 |
2 files changed, 41 insertions, 12 deletions
diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java index f8d2d3e8b1..eb826d1142 100644 --- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java +++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java @@ -177,13 +177,12 @@ public class MultiPartFilter implements Filter // Read each part boolean lastPart=false; - String content_disposition=null; - String content_transfer_encoding=null; - - + outer:while(!lastPart && params.size()<_maxFormKeys) { String type_content=null; + String content_disposition=null; + String content_transfer_encoding=null; while(true) { @@ -286,7 +285,7 @@ public class MultiPartFilter implements Filter if ("base64".equalsIgnoreCase(content_transfer_encoding)) { - in = new Base64InputStream(in); + in = new Base64InputStream((ReadLineInputStream)in); } else if ("quoted-printable".equalsIgnoreCase(content_transfer_encoding)) { @@ -618,14 +617,14 @@ public class MultiPartFilter implements Filter private static class Base64InputStream extends InputStream { - BufferedReader _in; + ReadLineInputStream _in; String _line; byte[] _buffer; int _pos; - public Base64InputStream (InputStream in) + public Base64InputStream (ReadLineInputStream in) { - _in = new BufferedReader(new InputStreamReader(in)); + _in = in; } @Override @@ -634,6 +633,7 @@ public class MultiPartFilter implements Filter if (_buffer==null || _pos>= _buffer.length) { _line = _in.readLine(); + System.err.println("LINE: "+_line); if (_line==null) return -1; if (_line.startsWith("--")) @@ -641,7 +641,13 @@ public class MultiPartFilter implements Filter else if (_line.length()==0) _buffer="\r\n".getBytes(); else - _buffer=B64Code.decode(_line); + { + ByteArrayOutputStream bout = new ByteArrayOutputStream(4*_line.length()/3); + B64Code.decode(_line, bout); + bout.write(13); + bout.write(10); + _buffer = bout.toByteArray(); + } _pos=0; } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java b/jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java index 78dd63c709..b8da7597b5 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java @@ -350,12 +350,34 @@ public class B64Code { if (encoded==null) return null; + + ByteArrayOutputStream bout = new ByteArrayOutputStream(4*encoded.length()/3); + decode(encoded, bout); + return bout.toByteArray(); + } + + /* ------------------------------------------------------------ */ + /** + * Base 64 decode as described in RFC 2045. + * <p>Unlike {@link #decode(char[])}, extra whitespace is ignored. + * @param encoded String to decode. + * @param output stream for decoded bytes + * @return byte array containing the decoded form of the input. + * @throws IllegalArgumentException if the input is not a valid + * B64 encoding. + */ + static public void decode (String encoded, ByteArrayOutputStream bout) + { + if (encoded==null) + return; + + if (bout == null) + throw new IllegalArgumentException("No outputstream for decoded bytes"); int ci=0; byte nibbles[] = new byte[4]; int s=0; - ByteArrayOutputStream bout = new ByteArrayOutputStream(4*encoded.length()/3); - + while (ci<encoded.length()) { char c=encoded.charAt(ci++); @@ -390,9 +412,10 @@ public class B64Code } - return bout.toByteArray(); + return; } + /* ------------------------------------------------------------ */ public static void encode(int value,Appendable buf) throws IOException { |