View Javadoc

1   package org.apache.hadoop.hbase.rest.filter;
2   
3   import java.io.IOException;
4   import java.util.HashSet;
5   import java.util.Set;
6   import java.util.StringTokenizer;
7   
8   import javax.servlet.Filter;
9   import javax.servlet.FilterChain;
10  import javax.servlet.FilterConfig;
11  import javax.servlet.ServletException;
12  import javax.servlet.ServletRequest;
13  import javax.servlet.ServletResponse;
14  import javax.servlet.http.HttpServletRequest;
15  import javax.servlet.http.HttpServletResponse;
16  
17  public class GzipFilter implements Filter {
18    private Set<String> mimeTypes = new HashSet<String>();
19  
20    @Override
21    public void init(FilterConfig filterConfig) throws ServletException {
22      String s = filterConfig.getInitParameter("mimeTypes");
23      if (s != null) {
24        StringTokenizer tok = new StringTokenizer(s, ",", false);
25        while (tok.hasMoreTokens()) {
26          mimeTypes.add(tok.nextToken());
27        }
28      }
29    }
30  
31    @Override
32    public void destroy() {
33    }
34  
35    @Override
36    public void doFilter(ServletRequest req, ServletResponse rsp,
37        FilterChain chain) throws IOException, ServletException {
38      HttpServletRequest request = (HttpServletRequest)req;
39      HttpServletResponse response = (HttpServletResponse)rsp;
40      String contentEncoding = request.getHeader("content-encoding");
41      String acceptEncoding = request.getHeader("accept-encoding");
42      String contentType = request.getHeader("content-type");
43      if ((contentEncoding != null) &&
44          (contentEncoding.toLowerCase().indexOf("gzip") > -1)) {
45        request = new GZIPRequestWrapper(request);
46      }
47      if (((acceptEncoding != null) &&
48            (acceptEncoding.toLowerCase().indexOf("gzip") > -1)) ||
49          ((contentType != null) && mimeTypes.contains(contentType))) {
50        response = new GZIPResponseWrapper(response);
51      }
52      chain.doFilter(request, response);
53      if ((response instanceof GZIPResponseWrapper)) {
54        ((GZIPResponseStream)response.getOutputStream()).finish();
55      }
56    }
57  }