|
1 // |
|
2 // Verify that the VALIDATE_NEVER and LOAD_FROM_CACHE flags override |
|
3 // heuristic query freshness as defined in RFC 2616 section 13.9 |
|
4 // |
|
5 |
|
6 Cu.import("resource://testing-common/httpd.js"); |
|
7 |
|
8 var httpserver = new HttpServer(); |
|
9 var index = 0; |
|
10 var tests = [ |
|
11 // RFC 2616 section 13.9 2nd paragraph - query-url should be validated |
|
12 {url: "/freshness?a", server: "0", expected: "0"}, |
|
13 {url: "/freshness?a", server: "1", expected: "1"}, |
|
14 |
|
15 // Setting the VALIDATE_NEVER flag should grab entry from cache |
|
16 {url: "/freshness?a", server: "2", expected: "1", |
|
17 flags: Components.interfaces.nsIRequest.VALIDATE_NEVER }, |
|
18 |
|
19 // Finally, check that request is validated with no flags set |
|
20 {url: "/freshness?a", server: "99", expected: "99"}, |
|
21 |
|
22 |
|
23 // RFC 2616 section 13.9 2nd paragraph - query-url should be validated |
|
24 {url: "/freshness?b", server: "0", expected: "0"}, |
|
25 {url: "/freshness?b", server: "1", expected: "1"}, |
|
26 |
|
27 // Setting the LOAD_FROM_CACHE flag also grab the entry from cache |
|
28 {url: "/freshness?b", server: "2", expected: "1", |
|
29 flags: Components.interfaces.nsIRequest.LOAD_FROM_CACHE }, |
|
30 |
|
31 // Finally, check that request is validated with no flags set |
|
32 {url: "/freshness?b", server: "99", expected: "99"}, |
|
33 |
|
34 ]; |
|
35 |
|
36 function logit(i, data) { |
|
37 dump(tests[i].url + "\t requested [" + tests[i].server + "]" + |
|
38 " got [" + data + "] expected [" + tests[i].expected + "]"); |
|
39 if (tests[i].responseheader) |
|
40 dump("\t[" + tests[i].responseheader + "]"); |
|
41 dump("\n"); |
|
42 } |
|
43 |
|
44 function setupChannel(suffix, value) { |
|
45 var ios = Components.classes["@mozilla.org/network/io-service;1"]. |
|
46 getService(Ci.nsIIOService); |
|
47 var chan = ios.newChannel("http://localhost:" + |
|
48 httpserver.identity.primaryPort + |
|
49 suffix, "", null); |
|
50 var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel); |
|
51 httpChan.requestMethod = "GET"; |
|
52 httpChan.setRequestHeader("x-request", value, false); |
|
53 return httpChan; |
|
54 } |
|
55 |
|
56 function triggerNextTest() { |
|
57 var test = tests[index]; |
|
58 var channel = setupChannel(test.url, test.server); |
|
59 if (test.flags) channel.loadFlags = test.flags; |
|
60 channel.asyncOpen(new ChannelListener(checkValueAndTrigger, null), null); |
|
61 } |
|
62 |
|
63 function checkValueAndTrigger(request, data, ctx) { |
|
64 logit(index, data); |
|
65 do_check_eq(tests[index].expected, data); |
|
66 |
|
67 if (index < tests.length-1) { |
|
68 index++; |
|
69 // this call happens in onStopRequest from the channel, and opening a |
|
70 // new channel to the same url here is no good idea... post it instead |
|
71 do_timeout(1, triggerNextTest); |
|
72 } else { |
|
73 httpserver.stop(do_test_finished); |
|
74 } |
|
75 } |
|
76 |
|
77 function run_test() { |
|
78 httpserver.registerPathHandler("/freshness", handler); |
|
79 httpserver.start(-1); |
|
80 |
|
81 // clear cache |
|
82 evict_cache_entries(); |
|
83 |
|
84 triggerNextTest(); |
|
85 |
|
86 do_test_pending(); |
|
87 } |
|
88 |
|
89 function handler(metadata, response) { |
|
90 var body = metadata.getHeader("x-request"); |
|
91 response.setHeader("Content-Type", "text/plain", false); |
|
92 response.setHeader("Date", getDateString(0), false); |
|
93 |
|
94 var header = tests[index].responseheader; |
|
95 if (header == null) { |
|
96 response.setHeader("Last-Modified", getDateString(-1), false); |
|
97 } else { |
|
98 var splitHdr = header.split(": "); |
|
99 response.setHeader(splitHdr[0], splitHdr[1], false); |
|
100 } |
|
101 |
|
102 response.setStatusLine(metadata.httpVersion, 200, "OK"); |
|
103 response.bodyOutputStream.write(body, body.length); |
|
104 } |
|
105 |
|
106 function getDateString(yearDelta) { |
|
107 var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', |
|
108 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; |
|
109 var days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; |
|
110 |
|
111 var d = new Date(); |
|
112 return days[d.getUTCDay()] + ", " + |
|
113 d.getUTCDate() + " " + |
|
114 months[d.getUTCMonth()] + " " + |
|
115 (d.getUTCFullYear() + yearDelta) + " " + |
|
116 d.getUTCHours() + ":" + d.getUTCMinutes() +":" + |
|
117 d.getUTCSeconds() + " UTC"; |
|
118 } |