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 }