//========================================================================
//$Id: PostFileFilter.java,v 1.1 2005/10/05 11:54:37 gregwilkins Exp $
//Copyright 2004 Mort Bay Consulting Pty. Ltd.
//------------------------------------------------------------------------
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//http://www.apache.org/licenses/LICENSE-2.0
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
//========================================================================
package net.lightbody.bmp.proxy.jetty.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/* ------------------------------------------------------------ */
/** PostFileFilter.
*
* Filter to accept file content from a POST request.
* The translated path is used as the file name to store the content from POST requests.
*
* Configuration init parameters:<ul>
* <li>bufferSize - The size of the buffer used to copy content
* <li>response - The response after the file is received:<ul>
* <li>ok - an empty response with an OK status
* <li>nocontent - an empty response with a NO_CONTENT status (the default)
* <li>chain - pass the request down the filter chain for normal response.
* <li>redirect - redirect for a GET request to the same URI
* </ul>
* </ul>
*
* @author gregw@mortbay.com
*
*/
public class PostFileFilter implements Filter
{
ServletContext _context;
int _bufferSize=8092;
String _response="nocontent";
public void init(FilterConfig filterConfig)
throws ServletException
{
_context=filterConfig.getServletContext();
String tmp=filterConfig.getInitParameter("bufferSize");
if (tmp!=null)
_bufferSize=Integer.parseInt(tmp);
tmp=filterConfig.getInitParameter("response");
if (tmp!=null)
_response=tmp;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest srequest = (HttpServletRequest)request;
HttpServletResponse sresponse = (HttpServletResponse)response;
if ("POST".equalsIgnoreCase(srequest.getMethod()))
{
String filename = srequest.getPathTranslated();
if (filename==null)
{
if (srequest.getPathInfo()==null)
filename=_context.getRealPath(srequest.getServletPath());
else
filename=_context.getRealPath(srequest.getServletPath()+srequest.getPathInfo());
}
if (filename==null)
{
sresponse.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
if (srequest.getContentLength()==0)
{
sresponse.sendError(HttpServletResponse.SC_LENGTH_REQUIRED);
return;
}
File file = new File(filename);
if (file.exists() && (!file.canWrite() ||
file.isDirectory()) ||
!file.exists() && ( !file.getParentFile().exists() ||
!file.getParentFile().isDirectory() ||
!file.getParentFile().canWrite()))
{
sresponse.sendError(HttpServletResponse.SC_FORBIDDEN, "No write permission");
return;
}
InputStream in = srequest.getInputStream();
FileOutputStream out = new FileOutputStream(file,false);
byte[] buf = new byte[_bufferSize];
while (true)
{
int len=in.read(buf);
if (len<0)
break;
out.write(buf,0,len);
}
out.close();
if ("redirect".equalsIgnoreCase(_response))
sresponse.sendRedirect(srequest.getRequestURI());
else if ("chain".equalsIgnoreCase(_response))
chain.doFilter(request, response);
else if ("ok".equalsIgnoreCase(_response))
sresponse.setStatus(HttpServletResponse.SC_OK);
else
sresponse.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
else
chain.doFilter(request, response);
}
public void destroy()
{}
}