480764 - Error parsing empty multipart.

Fixed by checking the presence of the last boundary as the first line.
This commit is contained in:
Simone Bordet 2015-10-27 15:29:56 +01:00
parent 0979125295
commit 487d0f2d5c
1 changed files with 56 additions and 51 deletions

View File

@ -175,7 +175,7 @@ public class MultiPartInputStreamParser
{ {
if (name == null) if (name == null)
return null; return null;
return (String)_headers.getValue(name.toLowerCase(Locale.ENGLISH), 0); return _headers.getValue(name.toLowerCase(Locale.ENGLISH), 0);
} }
/** /**
@ -357,7 +357,7 @@ public class MultiPartInputStreamParser
return Collections.emptyList(); return Collections.emptyList();
Collection<List<Part>> values = _parts.values(); Collection<List<Part>> values = _parts.values();
List<Part> parts = new ArrayList<Part>(); List<Part> parts = new ArrayList<>();
for (List<Part> o: values) for (List<Part> o: values)
{ {
List<Part> asList = LazyList.getList(o, false); List<Part> asList = LazyList.getList(o, false);
@ -404,7 +404,7 @@ public class MultiPartInputStreamParser
{ {
parse(); parse();
Collection<List<Part>> values = _parts.values(); Collection<List<Part>> values = _parts.values();
List<Part> parts = new ArrayList<Part>(); List<Part> parts = new ArrayList<>();
for (List<Part> o: values) for (List<Part> o: values)
{ {
List<Part> asList = LazyList.getList(o, false); List<Part> asList = LazyList.getList(o, false);
@ -425,7 +425,7 @@ public class MultiPartInputStreamParser
throws IOException throws IOException
{ {
parse(); parse();
return (Part)_parts.getValue(name, 0); return _parts.getValue(name, 0);
} }
@ -443,7 +443,7 @@ public class MultiPartInputStreamParser
//initialize //initialize
long total = 0; //keep running total of size of bytes read from input and throw an exception if exceeds MultipartConfigElement._maxRequestSize long total = 0; //keep running total of size of bytes read from input and throw an exception if exceeds MultipartConfigElement._maxRequestSize
_parts = new MultiMap<Part>(); _parts = new MultiMap<>();
//if its not a multipart request, don't parse it //if its not a multipart request, don't parse it
if (_contentType == null || !_contentType.startsWith("multipart/form-data")) if (_contentType == null || !_contentType.startsWith("multipart/form-data"))
@ -477,7 +477,8 @@ public class MultiPartInputStreamParser
} }
String boundary="--"+contentTypeBoundary; String boundary="--"+contentTypeBoundary;
byte[] byteBoundary=(boundary+"--").getBytes(StandardCharsets.ISO_8859_1); String lastBoundary=boundary+"--";
byte[] byteBoundary=lastBoundary.getBytes(StandardCharsets.ISO_8859_1);
// Get first boundary // Get first boundary
String line = null; String line = null;
@ -496,7 +497,7 @@ public class MultiPartInputStreamParser
boolean badFormatLogged = false; boolean badFormatLogged = false;
line=line.trim(); line=line.trim();
while (line != null && !line.equals(boundary)) while (line != null && !line.equals(boundary) && !line.equals(lastBoundary))
{ {
if (!badFormatLogged) if (!badFormatLogged)
{ {
@ -510,6 +511,10 @@ public class MultiPartInputStreamParser
if (line == null) if (line == null)
throw new IOException("Missing initial multi part boundary"); throw new IOException("Missing initial multi part boundary");
// Empty multipart.
if (line.equals(lastBoundary))
return;
// Read each part // Read each part
boolean lastPart=false; boolean lastPart=false;
@ -519,7 +524,7 @@ public class MultiPartInputStreamParser
String contentType=null; String contentType=null;
String contentTransferEncoding=null; String contentTransferEncoding=null;
MultiMap<String> headers = new MultiMap<String>(); MultiMap<String> headers = new MultiMap<>();
while(true) while(true)
{ {
line=((ReadLineInputStream)_in).readLine(); line=((ReadLineInputStream)_in).readLine();