test_bug490095.js (3831B)
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 "use strict"; 7 8 const { HttpServer } = ChromeUtils.importESModule( 9 "resource://testing-common/httpd.sys.mjs" 10 ); 11 12 var httpserver = new HttpServer(); 13 var index = 0; 14 var tests = [ 15 { url: "/freshness?a", server: "0", expected: "0" }, 16 { url: "/freshness?a", server: "1", expected: "1" }, 17 18 // Setting the VALIDATE_NEVER flag should grab entry from cache 19 { 20 url: "/freshness?a", 21 server: "2", 22 expected: "1", 23 flags: Ci.nsIRequest.VALIDATE_NEVER, 24 }, 25 26 // Finally, check that request is validated with no flags set 27 { url: "/freshness?a", server: "99", expected: "99" }, 28 29 { url: "/freshness?b", server: "0", expected: "0" }, 30 { url: "/freshness?b", server: "1", expected: "1" }, 31 32 // Setting the LOAD_FROM_CACHE flag also grab the entry from cache 33 { 34 url: "/freshness?b", 35 server: "2", 36 expected: "1", 37 flags: Ci.nsIRequest.LOAD_FROM_CACHE, 38 }, 39 40 // Finally, check that request is validated with no flags set 41 { url: "/freshness?b", server: "99", expected: "99" }, 42 ]; 43 44 function logit(i, data) { 45 dump( 46 tests[i].url + 47 "\t requested [" + 48 tests[i].server + 49 "]" + 50 " got [" + 51 data + 52 "] expected [" + 53 tests[i].expected + 54 "]" 55 ); 56 if (tests[i].responseheader) { 57 dump("\t[" + tests[i].responseheader + "]"); 58 } 59 dump("\n"); 60 } 61 62 function setupChannel(suffix, value) { 63 var chan = NetUtil.newChannel({ 64 uri: "http://localhost:" + httpserver.identity.primaryPort + suffix, 65 loadUsingSystemPrincipal: true, 66 }); 67 var httpChan = chan.QueryInterface(Ci.nsIHttpChannel); 68 httpChan.requestMethod = "GET"; 69 httpChan.setRequestHeader("x-request", value, false); 70 return httpChan; 71 } 72 73 function triggerNextTest() { 74 var test = tests[index]; 75 var channel = setupChannel(test.url, test.server); 76 if (test.flags) { 77 channel.loadFlags = test.flags; 78 } 79 channel.asyncOpen(new ChannelListener(checkValueAndTrigger, null)); 80 } 81 82 function checkValueAndTrigger(request, data) { 83 logit(index, data); 84 Assert.equal(tests[index].expected, data); 85 86 if (index < tests.length - 1) { 87 index++; 88 // this call happens in onStopRequest from the channel, and opening a 89 // new channel to the same url here is no good idea... post it instead 90 do_timeout(1, triggerNextTest); 91 } else { 92 httpserver.stop(do_test_finished); 93 } 94 } 95 96 function run_test() { 97 httpserver.registerPathHandler("/freshness", handler); 98 httpserver.start(-1); 99 100 // clear cache 101 evict_cache_entries(); 102 103 triggerNextTest(); 104 105 do_test_pending(); 106 } 107 108 function handler(metadata, response) { 109 var body = metadata.getHeader("x-request"); 110 response.setHeader("Content-Type", "text/plain", false); 111 response.setHeader("Date", getDateString(0), false); 112 response.setHeader("Cache-Control", "max-age=0", false); 113 114 var header = tests[index].responseheader; 115 if (header == null) { 116 response.setHeader("Last-Modified", getDateString(-1), false); 117 } else { 118 var splitHdr = header.split(": "); 119 response.setHeader(splitHdr[0], splitHdr[1], false); 120 } 121 122 response.setStatusLine(metadata.httpVersion, 200, "OK"); 123 response.bodyOutputStream.write(body, body.length); 124 } 125 126 function getDateString(yearDelta) { 127 var months = [ 128 "Jan", 129 "Feb", 130 "Mar", 131 "Apr", 132 "May", 133 "Jun", 134 "Jul", 135 "Aug", 136 "Sep", 137 "Oct", 138 "Nov", 139 "Dec", 140 ]; 141 var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; 142 143 var d = new Date(); 144 return ( 145 days[d.getUTCDay()] + 146 ", " + 147 d.getUTCDate() + 148 " " + 149 months[d.getUTCMonth()] + 150 " " + 151 (d.getUTCFullYear() + yearDelta) + 152 " " + 153 d.getUTCHours() + 154 ":" + 155 d.getUTCMinutes() + 156 ":" + 157 d.getUTCSeconds() + 158 " UTC" 159 ); 160 }