if(srequest.getContentType()==null||!srequest.getContentType().startsWith("multipart/form-data"))
{
chain.doFilter(request,response);
return;
}
LineInput in=new LineInput(request.getInputStream());
String content_type=srequest.getContentType();
String boundary="--"+value(content_type.substring(content_type.indexOf("boundary=")));
byte[] byteBoundary=(boundary+"--").getBytes(StringUtil.__ISO_8859_1);
MultiMap params = new MultiMap();
// Get first boundary
String line=in.readLine();
if(!line.equals(boundary))
{
log.warn(line);
throw new IOException("Missing initial multi part boundary");
}
// Read each part
boolean lastPart=false;
String content_disposition=null;
while(!lastPart)
{
while((line=in.readLine())!=null)
{
// If blank line, end of part headers
if(line.length()==0)
break;
// place part header key and value in map
int c=line.indexOf(':',0);
if(c>0)
{
String key=line.substring(0,c).trim().toLowerCase();
String value=line.substring(c+1,line.length()).trim();
if(key.equals("content-disposition"))
content_disposition=value;
}
}
// Extract content-disposition
boolean form_data=false;
if(content_disposition==null)
{
throw new IOException("Missing content-disposition");
}
StringTokenizer tok=new StringTokenizer(content_disposition,";");
String name=null;
String filename=null;
while(tok.hasMoreTokens())
{
String t=tok.nextToken().trim();
String tl=t.toLowerCase();
if(t.startsWith("form-data"))
form_data=true;
else if(tl.startsWith("name="))
name=value(t);
else if(tl.startsWith("filename="))
filename=value(t);
}
// Check disposition
if(!form_data)
{
log.warn("Non form-data part in multipart/form-data");
continue;
}
if(name==null||name.length()==0)
{
log.warn("Part with no name in multipart/form-data");
continue;
}
OutputStream out=null;
File file=null;
try
{
if (filename!=null && filename.length()>0)
{
file = File.createTempFile("MultiPart", "", tempdir);
out = new FileOutputStream(file);
request.setAttribute(name,file);
params.put(name, filename);
}
else
out=new ByteArrayOutputStream();
int state=-2;
int c;
boolean cr=false;
boolean lf=false;
// loop for all lines`
while(true)
{
int b=0;
while((c=(state!=-2)?state:in.read())!=-1)
{
state=-2;
// look for CR and/or LF
if(c==13||c==10)
{
if(c==13)
state=in.read();
break;
}
// look for boundary
if(b>=0&&b<byteBoundary.length&&c==byteBoundary[b])
b++;