public class WroResourceProxyRequestFilter implements Filter {
/**
* Logger for this class
*/
private static final Logger logger = LoggerFactory.getLogger(WroResourceProxyRequestFilter.class);
private static final String PARAM_RESOURCE_ID = "id";
private static final String PATH_RESOURCES = "wroResources";
private static final String PATH_API = "wroAPI";
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
logger.trace("doFilter(ServletRequest, ServletResponse, FilterChain) - start"); //$NON-NLS-1$
if (verifyAccess((HttpServletRequest) request, (HttpServletResponse) response)) {
serveProxyResourceUri((HttpServletRequest) request, (HttpServletResponse) response);
} else {
chain.doFilter(request, response);
}
logger.trace("doFilter(ServletRequest, ServletResponse, FilterChain) - end"); //$NON-NLS-1$
}
/**
* Serve proxy resource uri.
*
* @param request
* the request
* @param response
* the response
* @throws IOException
* Signals that an I/O exception has occurred.
*/
private void serveProxyResourceUri(final HttpServletRequest request, final HttpServletResponse response) throws IOException {
final String resourceUri = getResourceUri(request);
logger.debug("[OK] serving proxy resource: {}", resourceUri);
final OutputStream outputStream = response.getOutputStream();
response.setContentType(ContentTypeResolver.get(resourceUri, ResourceOptimizerConfiguration.DEFAULT_ENCODING));
InputStream is = null;
try {
is = ResourceOptimizerUtil.loadResource(resourceUri);
final int length = IOUtils.copy(is, outputStream);
// servlet engine may ignore this if content body is flushed to client
response.setContentLength(length);
response.setStatus(HttpServletResponse.SC_OK);
} finally {
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(outputStream);
}
}
/**
* Verify access.
*
* @param request
* the request
* @param response
* the response
* @return true, if successful
*/
private boolean verifyAccess(final HttpServletRequest request, final HttpServletResponse response) {
if (isProxyRequest(request)) {
final String resourceUri = getResourceUri(request);
if (resourceUri != null && resourceUri.startsWith(ResourceOptimizerConfiguration.CLASSPATH_RESOURCE_PREFIX)) {
return true;
}
}
return false;
}
/**
* Gets the resource uri.
*
* @param request
* the request
* @return the resource uri
*/
private String getResourceUri(final HttpServletRequest request) {
final String resourceUri = request.getParameter(PARAM_RESOURCE_ID);
return resourceUri;
}
/**
* Checks if is proxy request.
*
* @param request
* the request
* @return true, if is proxy request
*/
private boolean isProxyRequest(final HttpServletRequest request) {
final String apiHandlerValue = request.getParameter(PATH_API);
final String resourceId = request.getParameter(PARAM_RESOURCE_ID);
return PATH_RESOURCES.equals(apiHandlerValue) && resourceId != null;
}
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.trace("init(FilterConfig filterConfig={}) - start", filterConfig); //$NON-NLS-1$
logger.trace("init(FilterConfig) - end"); //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#destroy()
*/
@Override
public void destroy() {
logger.trace("destroy() - start"); //$NON-NLS-1$
logger.trace("destroy() - end"); //$NON-NLS-1$
}
}
As you can see, this solution is not fully optimized as I didn't handle NOT_MODIFIED response status (and I did not make injection).