Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Bartel2013-07-04 01:10:46 +0000
committerJan Bartel2013-07-04 01:11:44 +0000
commit091a4195686ad6b429d7170990e97a290d3a24bf (patch)
tree3dfef59099d52898610758d9ce32a0e977af8bf6
parentaa1aae182af1034edd4e895a5e1fcb8e2f47abb1 (diff)
downloadorg.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.java24
-rw-r--r--jetty-util/src/main/java/org/eclipse/jetty/util/B64Code.java29
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
{

Back to the top