1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package compressionFilters;
20
21 import java.io.IOException;
22 import java.util.Enumeration;
23
24 import javax.servlet.Filter;
25 import javax.servlet.FilterChain;
26 import javax.servlet.FilterConfig;
27 import javax.servlet.ServletException;
28 import javax.servlet.ServletRequest;
29 import javax.servlet.ServletResponse;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
32
33
34
35
36
37
38
39
40
41
42
43 public class CompressionFilter implements Filter {
44
45
46
47
48
49 private FilterConfig config = null;
50
51
52
53
54 private int minThreshold = 128;
55
56
57
58
59
60 protected int compressionThreshold;
61
62
63
64
65 private int debug = 0;
66
67
68
69
70
71
72
73 public void init(FilterConfig filterConfig) {
74
75 config = filterConfig;
76 if (filterConfig != null) {
77 String value = filterConfig.getInitParameter("debug");
78 if (value != null) {
79 debug = Integer.parseInt(value);
80 } else {
81 debug = 0;
82 }
83 String str = filterConfig.getInitParameter("compressionThreshold");
84 if (str != null) {
85 compressionThreshold = Integer.parseInt(str);
86 if (compressionThreshold != 0 && compressionThreshold < minThreshold) {
87 if (debug > 0) {
88 System.out.println("compressionThreshold should be either 0 - no compression or >= " + minThreshold);
89 System.out.println("compressionThreshold set to " + minThreshold);
90 }
91 compressionThreshold = minThreshold;
92 }
93 } else {
94 compressionThreshold = 0;
95 }
96
97 } else {
98 compressionThreshold = 0;
99 }
100
101 }
102
103
104
105
106 public void destroy() {
107
108 this.config = null;
109
110 }
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 public void doFilter(ServletRequest request, ServletResponse response,
130 FilterChain chain) throws IOException, ServletException {
131
132 if (debug > 0) {
133 System.out.println("@doFilter");
134 }
135
136 if (compressionThreshold == 0) {
137 if (debug > 0) {
138 System.out.println("doFilter gets called, but compressionTreshold is set to 0 - no compression");
139 }
140 chain.doFilter(request, response);
141 return;
142 }
143
144 boolean supportCompression = false;
145 if (request instanceof HttpServletRequest) {
146 if (debug > 1) {
147 System.out.println("requestURI = " + ((HttpServletRequest) request).getRequestURI());
148 }
149
150
151 String s = (String) ((HttpServletRequest) request).getParameter("gzip");
152 if ("false".equals(s)) {
153 if (debug > 0) {
154 System.out.println("got parameter gzip=false --> don't compress, just chain filter");
155 }
156 chain.doFilter(request, response);
157 return;
158 }
159
160 Enumeration e =
161 ((HttpServletRequest) request).getHeaders("Accept-Encoding");
162 while (e.hasMoreElements()) {
163 String name = (String) e.nextElement();
164 if (name.indexOf("gzip") != -1) {
165 if (debug > 0) {
166 System.out.println("supports compression");
167 }
168 supportCompression = true;
169 } else {
170 if (debug > 0) {
171 System.out.println("no support for compresion");
172 }
173 }
174 }
175 }
176
177 if (!supportCompression) {
178 if (debug > 0) {
179 System.out.println("doFilter gets called wo compression");
180 }
181 chain.doFilter(request, response);
182 return;
183 } else {
184 if (response instanceof HttpServletResponse) {
185 CompressionServletResponseWrapper wrappedResponse =
186 new CompressionServletResponseWrapper((HttpServletResponse) response);
187 wrappedResponse.setDebugLevel(debug);
188 wrappedResponse.setCompressionThreshold(compressionThreshold);
189 if (debug > 0) {
190 System.out.println("doFilter gets called with compression");
191 }
192 try {
193 chain.doFilter(request, wrappedResponse);
194 } finally {
195 wrappedResponse.finishResponse();
196 }
197 return;
198 }
199 }
200 }
201
202
203
204
205
206
207
208 public void setFilterConfig(FilterConfig filterConfig) {
209 init(filterConfig);
210 }
211
212
213
214
215
216 public FilterConfig getFilterConfig() {
217 return config;
218 }
219
220 }
221