tor-browser

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

test_bug482934.js (5407B)


      1 "use strict";
      2 
      3 const { HttpServer } = ChromeUtils.importESModule(
      4  "resource://testing-common/httpd.sys.mjs"
      5 );
      6 
      7 var response_code;
      8 var response_body;
      9 
     10 var request_time;
     11 var response_time;
     12 
     13 var cache_storage;
     14 
     15 var httpserver = new HttpServer();
     16 httpserver.start(-1);
     17 
     18 var base_url = "http://localhost:" + httpserver.identity.primaryPort;
     19 var resource = "/resource";
     20 var resource_url = base_url + resource;
     21 
     22 // Test flags
     23 var hit_server = false;
     24 
     25 function make_channel(aUrl) {
     26  // Reset test global status
     27  hit_server = false;
     28 
     29  var req = NetUtil.newChannel({ uri: aUrl, loadUsingSystemPrincipal: true });
     30  req.QueryInterface(Ci.nsIHttpChannel);
     31  req.setRequestHeader("If-Modified-Since", request_time, false);
     32  return req;
     33 }
     34 
     35 function make_uri(aUrl) {
     36  return Services.io.newURI(aUrl);
     37 }
     38 
     39 function resource_handler(aMetadata, aResponse) {
     40  hit_server = true;
     41  Assert.ok(aMetadata.hasHeader("If-Modified-Since"));
     42  Assert.equal(aMetadata.getHeader("If-Modified-Since"), request_time);
     43 
     44  if (response_code == "200") {
     45    aResponse.setStatusLine(aMetadata.httpVersion, 200, "OK");
     46    aResponse.setHeader("Content-Type", "text/plain", false);
     47    aResponse.setHeader("Last-Modified", response_time, false);
     48 
     49    aResponse.bodyOutputStream.write(response_body, response_body.length);
     50  } else if (response_code == "304") {
     51    aResponse.setStatusLine(aMetadata.httpVersion, 304, "Not Modified");
     52    aResponse.setHeader("Returned-From-Handler", "1");
     53  }
     54 }
     55 
     56 function check_cached_data(aCachedData, aCallback) {
     57  asyncOpenCacheEntry(
     58    resource_url,
     59    "disk",
     60    Ci.nsICacheStorage.OPEN_READONLY,
     61    null,
     62    function (aStatus, aEntry) {
     63      Assert.equal(aStatus, Cr.NS_OK);
     64      pumpReadStream(aEntry.openInputStream(0), function (aData) {
     65        Assert.equal(aData, aCachedData);
     66        aCallback();
     67      });
     68    }
     69  );
     70 }
     71 
     72 function run_test() {
     73  do_get_profile();
     74  evict_cache_entries();
     75 
     76  do_test_pending();
     77 
     78  cache_storage = getCacheStorage("disk");
     79  httpserver.registerPathHandler(resource, resource_handler);
     80 
     81  wait_for_cache_index(run_next_test);
     82 }
     83 
     84 // 1. send custom conditional request when we don't have an entry
     85 //    server returns 304 -> client receives 304
     86 add_test(() => {
     87  response_code = "304";
     88  response_body = "";
     89  request_time = "Thu, 1 Jan 2009 00:00:00 GMT";
     90  response_time = "Thu, 1 Jan 2009 00:00:00 GMT";
     91 
     92  var ch = make_channel(resource_url);
     93  ch.asyncOpen(
     94    new ChannelListener(function (aRequest) {
     95      syncWithCacheIOThread(() => {
     96        Assert.ok(hit_server);
     97        Assert.equal(
     98          aRequest.QueryInterface(Ci.nsIHttpChannel).responseStatus,
     99          304
    100        );
    101        Assert.ok(!cache_storage.exists(make_uri(resource_url), ""));
    102        Assert.equal(aRequest.getResponseHeader("Returned-From-Handler"), "1");
    103 
    104        run_next_test();
    105      }, true);
    106    }, null)
    107  );
    108 });
    109 
    110 // 2. send custom conditional request when we don't have an entry
    111 //    server returns 200 -> result is cached
    112 add_test(() => {
    113  response_code = "200";
    114  response_body = "content_body";
    115  request_time = "Thu, 1 Jan 2009 00:00:00 GMT";
    116  response_time = "Fri, 2 Jan 2009 00:00:00 GMT";
    117 
    118  var ch = make_channel(resource_url);
    119  ch.asyncOpen(
    120    new ChannelListener(function (aRequest) {
    121      syncWithCacheIOThread(() => {
    122        Assert.ok(hit_server);
    123        Assert.equal(
    124          aRequest.QueryInterface(Ci.nsIHttpChannel).responseStatus,
    125          200
    126        );
    127        Assert.ok(cache_storage.exists(make_uri(resource_url), ""));
    128 
    129        check_cached_data(response_body, run_next_test);
    130      }, true);
    131    }, null)
    132  );
    133 });
    134 
    135 // 3. send custom conditional request when we have an entry
    136 //    server returns 304 -> client receives 304 and cached entry is unchanged
    137 add_test(() => {
    138  response_code = "304";
    139  var cached_body = response_body;
    140  response_body = "";
    141  request_time = "Fri, 2 Jan 2009 00:00:00 GMT";
    142  response_time = "Fri, 2 Jan 2009 00:00:00 GMT";
    143 
    144  var ch = make_channel(resource_url);
    145  ch.asyncOpen(
    146    new ChannelListener(function (aRequest, aData) {
    147      syncWithCacheIOThread(() => {
    148        Assert.ok(hit_server);
    149        Assert.equal(
    150          aRequest.QueryInterface(Ci.nsIHttpChannel).responseStatus,
    151          304
    152        );
    153        Assert.ok(cache_storage.exists(make_uri(resource_url), ""));
    154        Assert.equal(aRequest.getResponseHeader("Returned-From-Handler"), "1");
    155        Assert.equal(aData, "");
    156 
    157        // Check the cache data is not changed
    158        check_cached_data(cached_body, run_next_test);
    159      }, true);
    160    }, null)
    161  );
    162 });
    163 
    164 // 4. send custom conditional request when we have an entry
    165 //    server returns 200 -> result is cached
    166 add_test(() => {
    167  response_code = "200";
    168  response_body = "updated_content_body";
    169  request_time = "Fri, 2 Jan 2009 00:00:00 GMT";
    170  response_time = "Sat, 3 Jan 2009 00:00:00 GMT";
    171  var ch = make_channel(resource_url);
    172  ch.asyncOpen(
    173    new ChannelListener(function (aRequest) {
    174      syncWithCacheIOThread(() => {
    175        Assert.ok(hit_server);
    176        Assert.equal(
    177          aRequest.QueryInterface(Ci.nsIHttpChannel).responseStatus,
    178          200
    179        );
    180        Assert.ok(cache_storage.exists(make_uri(resource_url), ""));
    181 
    182        // Check the cache data is updated
    183        check_cached_data(response_body, () => {
    184          run_next_test();
    185          httpserver.stop(do_test_finished);
    186        });
    187      }, true);
    188    }, null)
    189  );
    190 });