tor-browser

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

test_bug596443.js (2896B)


      1 "use strict";
      2 
      3 const { HttpServer } = ChromeUtils.importESModule(
      4  "resource://testing-common/httpd.sys.mjs"
      5 );
      6 
      7 var httpProtocolHandler = Cc[
      8  "@mozilla.org/network/protocol;1?name=http"
      9 ].getService(Ci.nsIHttpProtocolHandler);
     10 
     11 var httpserver = new HttpServer();
     12 
     13 var expectedOnStopRequests = 3;
     14 
     15 function setupChannel(suffix, xRequest, flags) {
     16  var chan = NetUtil.newChannel({
     17    uri: "http://localhost:" + httpserver.identity.primaryPort + suffix,
     18    loadUsingSystemPrincipal: true,
     19  });
     20  if (flags) {
     21    chan.loadFlags |= flags;
     22  }
     23 
     24  var httpChan = chan.QueryInterface(Ci.nsIHttpChannel);
     25  httpChan.setRequestHeader("x-request", xRequest, false);
     26 
     27  return httpChan;
     28 }
     29 
     30 function Listener(response) {
     31  this._response = response;
     32 }
     33 Listener.prototype = {
     34  _response: null,
     35  _buffer: null,
     36 
     37  QueryInterface: ChromeUtils.generateQI([
     38    "nsIStreamListener",
     39    "nsIRequestObserver",
     40  ]),
     41 
     42  onStartRequest() {
     43    this._buffer = "";
     44  },
     45  onDataAvailable(request, stream, offset, count) {
     46    this._buffer = this._buffer.concat(read_stream(stream, count));
     47  },
     48  onStopRequest() {
     49    Assert.equal(this._buffer, this._response);
     50    if (--expectedOnStopRequests == 0) {
     51      do_timeout(10, function () {
     52        httpserver.stop(do_test_finished);
     53      });
     54    }
     55  },
     56 };
     57 
     58 function run_test() {
     59  httpserver.registerPathHandler("/bug596443", handler);
     60  httpserver.start(-1);
     61 
     62  Services.prefs.setBoolPref("network.http.rcwn.enabled", false);
     63 
     64  // make sure we have a profile so we can use the disk-cache
     65  do_get_profile();
     66 
     67  // clear cache
     68  evict_cache_entries();
     69 
     70  httpProtocolHandler.EnsureHSTSDataReady().then(function () {
     71    var ch0 = setupChannel(
     72      "/bug596443",
     73      "Response0",
     74      Ci.nsIRequest.LOAD_BYPASS_CACHE
     75    );
     76    ch0.asyncOpen(new Listener("Response0"));
     77 
     78    var ch1 = setupChannel(
     79      "/bug596443",
     80      "Response1",
     81      Ci.nsIRequest.LOAD_BYPASS_CACHE
     82    );
     83    ch1.asyncOpen(new Listener("Response1"));
     84 
     85    var ch2 = setupChannel("/bug596443", "Should not be used");
     86    ch2.asyncOpen(new Listener("Response1")); // Note param: we expect this to come from cache
     87  });
     88 
     89  do_test_pending();
     90 }
     91 
     92 function triggerHandlers() {
     93  do_timeout(100, handlers[1]);
     94  do_timeout(100, handlers[0]);
     95 }
     96 
     97 var handlers = [];
     98 function handler(metadata, response) {
     99  var func = function (body) {
    100    return function () {
    101      response.setStatusLine(metadata.httpVersion, 200, "Ok");
    102      response.setHeader("Content-Type", "text/plain", false);
    103      response.setHeader("Content-Length", "" + body.length, false);
    104      response.setHeader("Cache-Control", "max-age=600", false);
    105      response.bodyOutputStream.write(body, body.length);
    106      response.finish();
    107    };
    108  };
    109 
    110  response.processAsync();
    111  var request = metadata.getHeader("x-request");
    112  handlers.push(func(request));
    113 
    114  if (handlers.length > 1) {
    115    triggerHandlers();
    116  }
    117 }