1 package de.halbekunst.juplo.cachecontrol;
3 import com.meterware.httpunit.WebResponse;
4 import de.halbekunst.juplo.test.HttpTestCase;
5 import java.net.URLEncoder;
7 import org.junit.runner.RunWith;
8 import java.text.SimpleDateFormat;
9 import java.util.Calendar;
10 import java.util.Date;
11 import java.util.HashSet;
12 import java.util.Locale;
14 import org.junit.Assert;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17 import org.springframework.test.context.ContextConfiguration;
18 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
26 @RunWith(SpringJUnit4ClassRunner.class)
27 @ContextConfiguration(locations = {
28 "classpath:/config.xml"
30 public class ParameterGuessingTest extends HttpTestCase {
31 private final static Logger log = LoggerFactory.getLogger(ParameterGuessingTest.class);
34 public ParameterGuessingTest() {
35 super("src/test/resources/web.xml");
40 public void testNothingSet() throws Exception {
42 log.info("-------- Test: Servlet does not implement getLastModified() and sets no Headers...");
44 WebResponse response = executeRequest("http://localhost/parameter-guessing?n=16");
45 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
46 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
47 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
48 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
49 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
50 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
51 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
52 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
53 long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
54 long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
55 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
59 public void testSetUnfilteredHeaders() throws Exception {
61 log.info("-------- Test: Servlet sets unfiltered Headers...");
63 WebResponse response = executeRequest("http://localhost/parameter-guessing?n=16&X-Debug=bla&Age=34&Content-Language=de");
64 Assert.assertEquals("bla", response.getHeaderField("X-Debug"));
65 Assert.assertEquals("34", response.getHeaderField("Age"));
66 Assert.assertEquals("de", response.getHeaderField("Content-Language"));
67 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
68 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
69 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
70 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
71 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
72 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
73 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
74 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
75 long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
76 long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
77 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
81 public void testETagSet() throws Exception {
83 log.info("-------- Test: Servlet sets Header \"ETag\"");
85 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
89 response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("\"bla\"", "UTF-8"));
90 Assert.assertEquals("\"bla\"", response.getHeaderField(Headers.HEADER_ETAG));
91 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
92 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
93 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
94 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
95 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
96 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
97 date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
98 expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
99 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
101 response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("\"bÄl\"a\"", "UTF-8"));
102 Assert.assertEquals("\"bla\"", response.getHeaderField(Headers.HEADER_ETAG));
103 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
104 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
105 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
106 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
107 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
108 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
109 date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
110 expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
111 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
113 response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("bla", "UTF-8"));
114 Assert.assertEquals("\"bla\"", response.getHeaderField(Headers.HEADER_ETAG));
115 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
116 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
117 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
118 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
119 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
120 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
121 date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
122 expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
123 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
125 response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("bÄl\"a", "UTF-8"));
126 Assert.assertEquals("\"bla\"", response.getHeaderField(Headers.HEADER_ETAG));
127 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
128 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
129 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
130 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
131 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
132 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
133 date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
134 expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
135 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
137 response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("W/\"blub\"", "UTF-8"));
138 Assert.assertEquals("W/\"blub\"", response.getHeaderField(Headers.HEADER_ETAG));
139 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
140 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
141 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
142 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
143 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
144 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
145 date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
146 expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
147 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
149 response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("W/\"bÄl\"ub\"", "UTF-8"));
150 Assert.assertEquals("W/\"blub\"", response.getHeaderField(Headers.HEADER_ETAG));
151 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
152 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
153 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
154 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
155 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
156 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
157 date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
158 expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
159 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
161 response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("W/blub", "UTF-8"));
162 Assert.assertEquals("W/\"blub\"", response.getHeaderField(Headers.HEADER_ETAG));
163 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
164 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
165 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
166 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
167 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
168 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
169 date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
170 expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
171 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
173 response = executeRequest("http://localhost/parameter-guessing?n=16&ETag=" + URLEncoder.encode("W/bÄl\"ub", "UTF-8"));
174 Assert.assertEquals("W/\"blub\"", response.getHeaderField(Headers.HEADER_ETAG));
175 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
176 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
177 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
178 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
179 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
180 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
181 date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
182 expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
183 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
187 public void testLastModifiedImplemented() throws Exception {
189 log.info("-------- Test: Servlet implements getLastModified()");
191 WebResponse response = executeRequest("http://localhost/parameter-guessing?n=16&l=1324162929861");
192 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
193 Assert.assertEquals("Sat, 17 Dec 2011 23:02:09 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
194 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
195 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
196 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
197 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
198 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
199 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
200 long date = df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime();
201 long expires = df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime();
202 Assert.assertTrue("Expires-Header passt nicht zum Date-Header! Unterschied: " + (expires-date)/1000 + " Sekunden.", date + 3600000 == expires);
206 public void testCacheControlSet() throws Exception {
208 log.info("-------- Test: Servlet sets Header \"Cache-Control\"");
210 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
212 WebResponse response;
216 Calendar calendar = Calendar.getInstance();
217 calendar.set(Calendar.MILLISECOND, 0);
220 uri = new StringBuilder();
221 uri.append("http://localhost/parameter-guessing");
223 uri.append("&Cache-Control=");
224 uri.append(URLEncoder.encode("max-age=120", "UTF-8"));
225 response = executeRequest(uri.toString());
226 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
227 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
228 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
229 Assert.assertEquals("max-age=120", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
230 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
231 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
232 date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
233 expires = (date.getTime()/1000l + 120l) * 1000l;
234 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
235 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires, df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
237 /** max-age=120, s-max-age=60, private, must-revalidate */
238 uri = new StringBuilder();
239 uri.append("http://localhost/parameter-guessing");
241 uri.append("&Cache-Control=");
242 uri.append(URLEncoder.encode("max-age=120, s-max-age=60, must-revalidate", "UTF-8"));
243 response = executeRequest(uri.toString());
244 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
245 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
246 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
247 params = new HashSet<String>();
248 for (String param : response.getHeaderFields(Headers.HEADER_CACHE_CONTROL))
249 for (String part : param.split(","))
250 params.add(part.trim());
251 Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"max-age=120\" nicht!", params.contains("max-age=120"));
252 Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"s-max-age=60\" nicht!", params.contains("s-max-age=60"));
253 Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"must-revalidate\" nicht!", params.contains("must-revalidate"));
254 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
255 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
256 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
257 date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
258 expires = (date.getTime()/1000l + 120l) * 1000l;
259 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires, df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
261 /** max-age=120, s-max-age=60, private, must-revalidate, BUT: several other values are set before */
262 uri = new StringBuilder();
263 uri.append("http://localhost/parameter-guessing");
265 uri.append("&Cache-Control=");
266 uri.append(URLEncoder.encode("no-store", "UTF-8"));
267 uri.append("&Cache-Control=");
268 uri.append(URLEncoder.encode("max-age=360, s-max-age=600, private", "UTF-8"));
269 uri.append("&Cache-Control=");
270 uri.append(URLEncoder.encode("public", "UTF-8"));
271 uri.append("&Cache-Control=");
272 uri.append(URLEncoder.encode("max-age=120, s-max-age=60, must-revalidate", "UTF-8"));
273 response = executeRequest(uri.toString());
274 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
275 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
276 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
277 params = new HashSet<String>();
278 for (String param : response.getHeaderFields(Headers.HEADER_CACHE_CONTROL))
279 for (String part : param.split(","))
280 params.add(part.trim());
281 Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"max-age=120\" nicht!", params.contains("max-age=120"));
282 Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"s-max-age=60\" nicht!", params.contains("s-max-age=60"));
283 Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"must-revalidate\" nicht!", params.contains("must-revalidate"));
284 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
285 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
286 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
287 date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
288 expires = (date.getTime()/1000l + 120l) * 1000l;
289 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires, df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
293 public void testDateSet() throws Exception {
295 log.info("-------- Test: Servlet sets Header \"Date\"");
297 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
299 WebResponse response;
301 Calendar calendar = Calendar.getInstance();
302 calendar.set(Calendar.MILLISECOND, 0);
304 /** Date ca NOW -1m */
305 calendar.add(Calendar.MINUTE, -1);
306 date = calendar.getTime();
307 calendar.add(Calendar.MINUTE, 60); /** default max-age=3600 yields 60m! */
308 expires = calendar.getTime();
309 uri = new StringBuilder();
310 uri.append("http://localhost/parameter-guessing");
312 uri.append("&Date=");
313 uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
314 response = executeRequest(uri.toString());
315 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
316 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
317 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
318 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
319 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
320 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
321 Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
322 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
323 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
325 /** Date ca NOW -1m, BUT: is set to some garbage values before */
326 calendar.add(Calendar.MINUTE, -1);
327 date = calendar.getTime();
328 calendar.add(Calendar.MINUTE, 60); /** default max-age=3600 yields 60m! */
329 expires = calendar.getTime();
330 uri = new StringBuilder();
331 uri.append("http://localhost/parameter-guessing");
333 uri.append("&Date=");
334 calendar.add(Calendar.MINUTE, 10);
335 uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
336 uri.append("&Date=");
337 calendar.add(Calendar.HOUR, -2);
338 uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
339 uri.append("&Date=");
340 calendar.add(Calendar.DATE, 1);
341 uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
342 uri.append("&Date=");
343 uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
344 response = executeRequest(uri.toString());
345 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
346 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
347 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
348 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
349 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
350 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
351 Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
352 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
353 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
357 public void testExpiresSet() throws Exception {
359 log.info("-------- Test: Servlet sets Header \"Expires\"");
361 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
363 WebResponse response;
366 Calendar calendar = Calendar.getInstance();
367 calendar.set(Calendar.MILLISECOND, 0);
369 /** Expires ca. NOW + 10m */
370 calendar.add(Calendar.MINUTE, 10);
371 expires = calendar.getTime();
372 uri = new StringBuilder();
373 uri.append("http://localhost/parameter-guessing");
375 uri.append("&Expires=");
376 uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
377 response = executeRequest(uri.toString());
378 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
379 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
380 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
381 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
382 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
383 date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
384 age = (expires.getTime() - date.getTime())/1000l;
385 Assert.assertEquals("max-age=" + age, response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
386 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
387 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
389 /** Expires ca. NOW + 10m, BUT: is set to some garbage values before */
390 calendar.add(Calendar.MINUTE, 10);
391 uri = new StringBuilder();
392 uri.append("http://localhost/parameter-guessing");
394 uri.append("&Expires=");
395 calendar.add(Calendar.MINUTE, 10);
396 uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
397 uri.append("&Expires=");
398 calendar.add(Calendar.HOUR, -2);
399 uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
400 uri.append("&Expires=");
401 calendar.add(Calendar.DATE, 1);
402 uri.append(URLEncoder.encode(df.format(calendar.getTime()), "UTF-8"));
403 uri.append("&Expires=");
404 uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
405 response = executeRequest(uri.toString());
406 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
407 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
408 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
409 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
410 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
411 date = df.parse(response.getHeaderField(Headers.HEADER_DATE));
412 age = (expires.getTime() - date.getTime())/1000l;
413 Assert.assertEquals("max-age=" + age, response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
414 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
415 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
419 public void testDateAndExpiresSet() throws Exception {
421 log.info("-------- Test: Servlet sets Header's \"Date\" and \"Expires\"");
423 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
425 WebResponse response;
426 Date date, expires, garbage;
427 Calendar calendar = Calendar.getInstance();
428 calendar.set(Calendar.MILLISECOND, 0);
430 /** Expires = Date + 30m */
431 date = calendar.getTime();
432 calendar.add(Calendar.MINUTE, 30);
433 expires = calendar.getTime();
434 uri = new StringBuilder();
435 uri.append("http://localhost/parameter-guessing");
437 uri.append("&Date=");
438 uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
439 uri.append("&Expires=");
440 uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
441 response = executeRequest(uri.toString());
442 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
443 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
444 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
445 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
446 Assert.assertEquals("max-age=1800", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
447 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
448 Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
449 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
450 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
452 /** Expires = Date + 30m, BUT: Date is set to Date - 2h first and Expires to Date */
453 date = calendar.getTime();
454 calendar.add(Calendar.MINUTE, 30);
455 expires = calendar.getTime();
456 calendar.add(Calendar.HOUR, -2);
457 garbage = calendar.getTime();
458 uri = new StringBuilder();
459 uri.append("http://localhost/parameter-guessing");
461 uri.append("&Date=");
462 uri.append(URLEncoder.encode(df.format(garbage), "UTF-8"));
463 uri.append("&Expires=");
464 uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
465 uri.append("&Date=");
466 uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
467 uri.append("&Expires=");
468 uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
469 response = executeRequest(uri.toString());
470 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
471 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
472 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
473 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
474 Assert.assertEquals("max-age=1800", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
475 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
476 Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
477 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
478 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
480 /** Expires = Date - 1h --> will be ignored! */
481 date = calendar.getTime();
482 calendar.add(Calendar.MINUTE, -60);
483 garbage = calendar.getTime();
484 calendar.setTime(date);
485 calendar.add(Calendar.MINUTE, 60); /** default max-age=3600 yields 60m! */
486 expires = calendar.getTime();
487 uri = new StringBuilder();
488 uri.append("http://localhost/parameter-guessing");
490 uri.append("&Date=");
491 uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
492 uri.append("&Expires=");
493 uri.append(URLEncoder.encode(df.format(garbage), "UTF-8"));
494 response = executeRequest(uri.toString());
495 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
496 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
497 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
498 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
499 Assert.assertEquals("max-age=3600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
500 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
501 Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
502 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
503 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
507 public void testCacheControlDateAndExpiresSet() throws Exception {
509 log.info("-------- Test: Servlet sets Header's \"Cache-Control\", \"Date\" and \"Expires\"");
511 SimpleDateFormat df = new SimpleDateFormat(Headers.RFC_1123_DATE_FORMAT, Locale.US);
513 WebResponse response;
514 Date date, expires, expected;
516 Calendar calendar = Calendar.getInstance();
517 calendar.set(Calendar.MILLISECOND, 0);
519 /** Expires = Date + 30m, Cache-Control: must-revalidate, no-store */
520 date = calendar.getTime();
521 calendar.add(Calendar.MINUTE, 30);
522 expires = calendar.getTime();
523 uri = new StringBuilder();
524 uri.append("http://localhost/parameter-guessing");
526 uri.append("&Cache-Control=");
527 uri.append(URLEncoder.encode("must-revalidate, no-store", "UTF-8"));
528 uri.append("&Date=");
529 uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
530 uri.append("&Expires=");
531 uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
532 response = executeRequest(uri.toString());
533 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
534 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
535 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
536 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
537 params = new HashSet<String>();
538 for (String param : response.getHeaderFields(Headers.HEADER_CACHE_CONTROL))
539 for (String part : param.split(","))
540 params.add(part.trim());
541 Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"max-age=1800\" nicht!", params.contains("max-age=1800"));
542 Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"must-revalidate\" nicht!", params.contains("must-revalidate"));
543 Assert.assertTrue(response.getHeaderField(Headers.HEADER_CACHE_CONTROL) + " enthält \"no-store\" nicht!", params.contains("no-store"));
544 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
545 Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
546 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
547 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expires.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());
549 /** Expires = Date + 30m, BUT: max-age is set to 600s */
550 date = calendar.getTime();
551 calendar.add(Calendar.MINUTE, 10);
552 expected = calendar.getTime();
553 calendar.add(Calendar.MINUTE, 20);
554 expires = calendar.getTime();
555 uri = new StringBuilder();
556 uri.append("http://localhost/parameter-guessing");
558 uri.append("&Date=");
559 uri.append(URLEncoder.encode(df.format(date), "UTF-8"));
560 uri.append("&Expires=");
561 uri.append(URLEncoder.encode(df.format(expires), "UTF-8"));
562 uri.append("&Cache-Control=");
563 uri.append(URLEncoder.encode("max-age=600", "UTF-8"));
564 response = executeRequest(uri.toString());
565 Assert.assertEquals("W/\"Hallo Welt!\"", response.getHeaderField(Headers.HEADER_ETAG));
566 Assert.assertEquals("Thu, 01 Jan 1970 00:00:00 GMT", response.getHeaderField(Headers.HEADER_LAST_MODIFIED));
567 Assert.assertEquals("gzip", response.getHeaderField(Headers.HEADER_CONTENT_ENCODING));
568 Assert.assertEquals("text/plain; charset=iso-8859-1", response.getHeaderField(Headers.HEADER_CONTENT_TYPE));
569 Assert.assertEquals("max-age=600", response.getHeaderField(Headers.HEADER_CACHE_CONTROL));
570 Assert.assertNotNull("Date-Header was not set!", response.getHeaderField(Headers.HEADER_DATE));
571 Assert.assertEquals("Unerwartetr Wert für den Date-Header!", date.getTime(), df.parse(response.getHeaderField(Headers.HEADER_DATE)).getTime());
572 Assert.assertNotNull("Expires-Header was not set!", response.getHeaderField(Headers.HEADER_EXPIRES));
573 Assert.assertEquals("Unerwartetr Wert für den Expires-Header!", expected.getTime(), df.parse(response.getHeaderField(Headers.HEADER_EXPIRES)).getTime());