in commons-jcs3-jcache-extras/src/main/java/org/apache/commons/jcs3/jcache/extras/web/JCacheFilter.java [115:212]
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException
{
boolean gzip = false;
if (HttpServletRequest.class.isInstance(servletRequest))
{
final Enumeration<String> acceptEncoding = HttpServletRequest.class.cast(servletRequest).getHeaders("Accept-Encoding");
while (acceptEncoding != null && acceptEncoding.hasMoreElements())
{
if ("gzip".equals(acceptEncoding.nextElement()))
{
gzip = true;
break;
}
}
}
final HttpServletResponse httpServletResponse = HttpServletResponse.class.cast(servletResponse);
checkResponse(httpServletResponse);
final PageKey key = new PageKey(key(servletRequest), gzip);
Page page = cache.get(key);
if (page == null)
{
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final InMemoryResponse response;
if (gzip)
{
response = new InMemoryResponse(httpServletResponse, new GZIPOutputStream(baos));
}
else
{
response = new InMemoryResponse(httpServletResponse, baos);
}
filterChain.doFilter(servletRequest, response);
response.flushBuffer();
page = new Page(
response.getStatus(),
response.getContentType(),
response.getContentLength(),
response.getCookies(),
response.getHeaders(),
baos.toByteArray());
cache.put(key, page);
}
if (page.status == SC_OK) {
checkResponse(httpServletResponse);
if (gzip)
{
httpServletResponse.setHeader("Content-Encoding", "gzip");
}
httpServletResponse.setStatus(page.status);
if (page.contentType != null)
{
httpServletResponse.setContentType(page.contentType);
}
if (page.contentLength > 0)
{
httpServletResponse.setContentLength(page.contentLength);
}
for (final Cookie c : page.cookies)
{
httpServletResponse.addCookie(c);
}
for (final Map.Entry<String, List<Serializable>> entry : page.headers.entrySet())
{
for (final Serializable value : entry.getValue())
{
if (Integer.class.isInstance(value))
{
httpServletResponse.addIntHeader(entry.getKey(), Integer.class.cast(value));
}
else if (String.class.isInstance(value))
{
httpServletResponse.addHeader(entry.getKey(), String.class.cast(value));
}
else if (Long.class.isInstance(value))
{
httpServletResponse.addDateHeader(entry.getKey(), Long.class.cast(value));
}
}
}
httpServletResponse.setContentLength(page.out.length);
final BufferedOutputStream bos = new BufferedOutputStream(httpServletResponse.getOutputStream());
if (page.out.length != 0)
{
bos.write(page.out);
}
else
{
bos.write(new byte[0]);
}
bos.flush();
}
}