View Javadoc

1   package com.atlassian.gzipfilter.selector;
2   
3   import java.util.HashSet;
4   import java.util.List;
5   import java.util.Set;
6   
7   import javax.servlet.FilterConfig;
8   import javax.servlet.http.HttpServletRequest;
9   
10  import static java.util.Arrays.asList;
11  import static java.util.Collections.unmodifiableList;
12  import static java.util.Collections.unmodifiableSet;
13  
14  /**
15   * This factory will lok into user agent header to decide whenever to dogzip compressing or not
16   * <p/>
17   * By default gzip is on for defaultCompressableMimeTypes mime types and off for noCompressionUserAgents (IE 6 only)
18   * <p/>
19   * This is adjustable via COMPRESSABLE_MIME_TYPES_PARAM_NAME an NO_COMPRESSION_USER_AGENTS_PARAM_NAME init-params
20   * respectively
21   */
22  public class UserAgentBasedGzipSelectorFactory implements GzipCompatibilitySelectorFactory
23  {
24  
25      public static final String COMPRESSABLE_MIME_TYPES_PARAM_NAME = "compressableMimeTypes";
26  
27      public static final String NO_COMPRESSION_USER_AGENTS_PARAM_NAME = "noCompressionUserAgents";
28  
29      public static final String USER_AGENT_HEADER = "User-Agent";
30  
31      private static final GzipCompatibilitySelector NO_GZIP_SELECTOR = new NoGzipCompatibilitySelector();
32  
33      public static final Set<String> DEFAULT_COMPRESSABLE_MIME_TYPES = unmodifiableSet(new HashSet<String>(asList(
34                              "text/html",
35                              "text/xml",
36                              "text/plain",
37                              "text/javascript",
38                              "text/css",
39                              "application/javascript",
40                              "application/x-javascript",
41                              "application/xml",
42                              "application/xhtml",
43                              "application/xhtml+xml",
44                              "application/json")));
45  
46      private static final List<String> DEFAULT_NO_COMPRESSION_USER_AGENTS = unmodifiableList(asList("MSIE 6"));
47  
48      private final Set<String> compressableMimeTypes;
49      private final List<String> noCompressionUserAgents;
50  
51      public UserAgentBasedGzipSelectorFactory(FilterConfig filterConfig)
52      {
53          final String compressableMimeTypesString = filterConfig.getInitParameter(COMPRESSABLE_MIME_TYPES_PARAM_NAME);
54          compressableMimeTypes = compressableMimeTypesString != null
55                  ? unmodifiableSet(new HashSet<String>(split(compressableMimeTypesString)))
56                  : DEFAULT_COMPRESSABLE_MIME_TYPES;
57  
58          final String noCompressionUserAgentsString = filterConfig.getInitParameter(NO_COMPRESSION_USER_AGENTS_PARAM_NAME);
59          noCompressionUserAgents = noCompressionUserAgentsString != null
60                  ? unmodifiableList(split(noCompressionUserAgentsString))
61                  : DEFAULT_NO_COMPRESSION_USER_AGENTS;
62  
63      }
64  
65      public GzipCompatibilitySelector getSelector(final FilterConfig filterConfig, final HttpServletRequest request)
66      {
67          final String userAgentHeader = request.getHeader(USER_AGENT_HEADER);
68          if (userAgentHeader != null)
69          {
70              for (String noCompressionUserAgent : noCompressionUserAgents)
71              {
72                  if (userAgentHeader.contains(noCompressionUserAgent))
73                  {
74                      return NO_GZIP_SELECTOR;
75                  }
76              }
77          }
78          return new MimeTypeBasedSelector(compressableMimeTypes);
79      }
80  
81      private List<String> split(String string)
82      {
83          return asList(string.split(","));
84      }
85  }