tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }