throws TurbineException
{
String contentType = req.getHeader(CONTENT_TYPE);
if(!contentType.startsWith(MULTIPART_FORM_DATA))
{
throw new TurbineException("the request doesn't contain a " +
MULTIPART_FORM_DATA + " stream");
}
int requestSize = req.getContentLength();
if(requestSize == -1)
{
throw new TurbineException("the request was rejected because " +
"it's size is unknown");
}
if(requestSize > TurbineUpload.getSizeMax())
{
throw new TurbineException("the request was rejected because " +
"it's size exceeds allowed range");
}
try
{
byte[] boundary = contentType.substring(
contentType.indexOf("boundary=")+9).getBytes();
InputStream input = (InputStream)req.getInputStream();
MultipartStream multi = new MultipartStream(input, boundary);
boolean nextPart = multi.skipPreamble();
while(nextPart)
{
Map headers = parseHeaders(multi.readHeaders());
String fieldName = getFieldName(headers);
if (fieldName != null)
{
String subContentType = getHeader(headers, CONTENT_TYPE);
if (subContentType != null && subContentType
.startsWith(MULTIPART_MIXED))
{
// Multiple files.
byte[] subBoundary =
subContentType.substring(
subContentType
.indexOf("boundary=")+9).getBytes();
multi.setBoundary(subBoundary);
boolean nextSubPart = multi.skipPreamble();
while (nextSubPart)
{
headers = parseHeaders(multi.readHeaders());
if (getFileName(headers) != null)
{
FileItem item = createItem(path, headers,
requestSize);
OutputStream os = item.getOutputStream();
try
{
multi.readBodyData(os);
}
finally
{
os.close();
}
params.append(getFieldName(headers), item);
}
else
{
// Ignore anything but files inside
// multipart/mixed.
multi.discardBodyData();
}
nextSubPart = multi.readBoundary();
}
multi.setBoundary(boundary);
}
else
{
if (getFileName(headers) != null)
{
// A single file.
FileItem item = createItem(path, headers,
requestSize);
OutputStream os = item.getOutputStream();
try
{
multi.readBodyData(os);
}
finally
{
os.close();
}
params.append(getFieldName(headers), item);
}
else
{
// A form field.
FileItem item = createItem(path, headers,
requestSize);
OutputStream os = item.getOutputStream();
try
{
multi.readBodyData(os);
}
finally
{
os.close();
}
params.append(getFieldName(headers),
new String(item.get()));
}
}
}
else
{
// Skip this part.
multi.discardBodyData();
}
nextPart = multi.readBoundary();
}
}
catch(IOException e)
{
throw new TurbineException("Processing of " + MULTIPART_FORM_DATA
+ " request failed", e);
}
}