1 package com.panogenesis.webapp.filter;
2
3 import java.io.IOException;
4
5 import javax.servlet.Filter;
6 import javax.servlet.FilterChain;
7 import javax.servlet.FilterConfig;
8 import javax.servlet.ServletException;
9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16
17 import org.displaytag.tags.TableTagParameters;
18
19 /***
20 * Filter that compresses output with gzip (assuming that browser supports gzip).
21 * Code from <a href="http://www.onjava.com/pub/a/onjava/2003/11/19/filters.html">
22 * http://www.onjava.com/pub/a/onjava/2003/11/19/filters.html</a>.
23 *
24 * © 2003 Jayson Falkner You may freely use the code both commercially
25 * and non-commercially.
26 *
27 * @author Matt Raible
28 *
29 * @web.filter
30 * display-name="Compression Filter"
31 * name="compressionFilter"
32 */
33 public class GZIPFilter implements Filter {
34 private final transient Log log = LogFactory.getLog(GZIPFilter.class);
35
36 public void doFilter(ServletRequest req, ServletResponse res,
37 FilterChain chain)
38 throws IOException, ServletException {
39 if (req instanceof HttpServletRequest) {
40 HttpServletRequest request = (HttpServletRequest) req;
41 HttpServletResponse response = (HttpServletResponse) res;
42
43 if (isGZIPSupported(request)) {
44 if (log.isDebugEnabled()) {
45 log.debug("GZIP supported, compressing response");
46 }
47
48 GZIPResponseWrapper wrappedResponse =
49 new GZIPResponseWrapper(response);
50
51 chain.doFilter(req, wrappedResponse);
52 wrappedResponse.finishResponse();
53
54 return;
55 }
56
57 chain.doFilter(req, res);
58 }
59 }
60
61 /***
62 * Convenience method to test for GZIP cababilities
63 * @param req The current user request
64 * @return boolean indicating GZIP support
65 */
66 private boolean isGZIPSupported(HttpServletRequest req) {
67
68
69 String exporting =
70 req.getParameter(TableTagParameters.PARAMETER_EXPORTING);
71
72 if (exporting != null) {
73 if (log.isDebugEnabled()) {
74 log.debug("detected excel export, disabling filter...");
75 }
76 return false;
77 }
78
79 String browserEncodings = req.getHeader("accept-encoding");
80 boolean supported =
81 ((browserEncodings != null) &&
82 (browserEncodings.indexOf("gzip") != -1));
83
84 String userAgent = req.getHeader("user-agent");
85
86 if ((userAgent != null) && userAgent.startsWith("httpunit")) {
87 if (log.isDebugEnabled()) {
88 log.debug("httpunit detected, disabling filter...");
89 }
90
91 return false;
92 } else {
93 return supported;
94 }
95 }
96
97 public void init(FilterConfig filterConfig) {
98 }
99
100 public void destroy() {
101 }
102 }