public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if(request.getAttribute(DOFILTER_CALLED)!=null)
{
chain.doFilter(request, response);
return;
}
request.setAttribute(DOFILTER_CALLED,"true");
if (!(response instanceof HttpServletResponse)) {
chain.doFilter(request, response);
return;
}
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletRequest extendedRequest = httpRequest;
// For multipart/form-data requests
if (FileUpload.isMultipartContent(httpRequest)) {
extendedRequest = new MultipartRequestWrapper(httpRequest, _uploadMaxFileSize, _uploadThresholdSize, _uploadRepositoryPath);
}
// Serve resources
AddResource addResource;
try
{
addResource=AddResourceFactory.getInstance(httpRequest);
if( addResource.isResourceUri(_servletContext, httpRequest ) ){
addResource.serveResource(_servletContext, httpRequest, httpResponse);
return;
}
}
catch(Throwable th)
{
log.error("Exception wile retrieving addResource",th);
throw new ServletException(th);
}
try
{
addResource.responseStarted();
if (addResource.requiresBuffer())
{
ExtensionsResponseWrapper extendedResponse = new ExtensionsResponseWrapper((HttpServletResponse) response);
// Standard request
chain.doFilter(extendedRequest, extendedResponse);
extendedResponse.finishResponse();
// write the javascript stuff for myfaces and headerInfo, if needed
HttpServletResponse servletResponse = (HttpServletResponse)response;
// only parse HTML responses
if (extendedResponse.getContentType() != null && isValidContentType(extendedResponse.getContentType()))
{
addResource.parseResponse(extendedRequest, extendedResponse.toString(),
servletResponse);
addResource.writeMyFacesJavascriptBeforeBodyEnd(extendedRequest,
servletResponse);
if( ! addResource.hasHeaderBeginInfos() ){
// writes the response if no header info is needed
addResource.writeResponse(extendedRequest, servletResponse);
return;
}
// Some headerInfo has to be added
addResource.writeWithFullHeader(extendedRequest, servletResponse);
// writes the response
addResource.writeResponse(extendedRequest, servletResponse);
}
else
{
byte[] responseArray = extendedResponse.getBytes();
if(responseArray.length > 0)
{
// When not filtering due to not valid content-type, deliver the byte-array instead of a charset-converted string.
// Otherwise a binary stream gets corrupted.
servletResponse.getOutputStream().write(responseArray);
}
}
}
else
{
chain.doFilter(extendedRequest, response);
}
}
finally
{
addResource.responseFinished();
}
}
|