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
16
17
18
19
20
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 }