tor-browser

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

test_bug1411316_http1.js (2929B)


      1 // Test bug 1411316.
      2 //
      3 // Summary:
      4 // The purpose of this test is to test whether the HttpConnectionMgr really
      5 // cancel and close all connecitons when get "net:cancel-all-connections".
      6 //
      7 // Test step:
      8 // 1. Create 6 http requests. Server would not process responses and just put
      9 //    all requests in its queue.
     10 // 2. Once server receive all 6 requests, call notifyObservers with the
     11 //    topic "net:cancel-all-connections".
     12 // 3. We expect that all 6 active connections should be closed with the status
     13 //    NS_ERROR_ABORT.
     14 
     15 "use strict";
     16 
     17 const { HttpServer } = ChromeUtils.importESModule(
     18  "resource://testing-common/httpd.sys.mjs"
     19 );
     20 
     21 var server = new HttpServer();
     22 server.start(-1);
     23 var baseURL = "http://localhost:" + server.identity.primaryPort + "/";
     24 var maxConnections = 0;
     25 var debug = false;
     26 var requestId = 0;
     27 
     28 function log(msg) {
     29  if (!debug) {
     30    return;
     31  }
     32 
     33  if (msg) {
     34    dump("TEST INFO | " + msg + "\n");
     35  }
     36 }
     37 
     38 function make_channel(url) {
     39  var request = NetUtil.newChannel({
     40    uri: url,
     41    loadUsingSystemPrincipal: true,
     42  });
     43  request.QueryInterface(Ci.nsIHttpChannel);
     44  return request;
     45 }
     46 
     47 function serverStopListener() {
     48  server.stop();
     49 }
     50 
     51 function createHttpRequest(status) {
     52  let uri = baseURL;
     53  var chan = make_channel(uri);
     54  var listner = new HttpResponseListener(++requestId, status);
     55  chan.setRequestHeader("X-ID", requestId, false);
     56  chan.setRequestHeader("Cache-control", "no-store", false);
     57  chan.asyncOpen(listner);
     58  log("Create http request id=" + requestId);
     59 }
     60 
     61 function setupHttpRequests(status) {
     62  log("setupHttpRequests");
     63  for (var i = 0; i < maxConnections; i++) {
     64    createHttpRequest(status);
     65    do_test_pending();
     66  }
     67 }
     68 
     69 function HttpResponseListener(id, onStopRequestStatus) {
     70  this.id = id;
     71  this.onStopRequestStatus = onStopRequestStatus;
     72 }
     73 
     74 HttpResponseListener.prototype = {
     75  onStartRequest() {},
     76 
     77  onDataAvailable() {},
     78 
     79  onStopRequest(request, status) {
     80    log("STOP id=" + this.id + " status=" + status);
     81    Assert.equal(this.onStopRequestStatus, status);
     82    do_test_finished();
     83  },
     84 };
     85 
     86 var responseQueue = [];
     87 function setup_http_server() {
     88  log("setup_http_server");
     89  maxConnections = Services.prefs.getIntPref(
     90    "network.http.max-persistent-connections-per-server"
     91  );
     92 
     93  // Start server; will be stopped at test cleanup time.
     94  server.registerPathHandler("/", function (metadata, response) {
     95    var id = metadata.getHeader("X-ID");
     96    log("Server recived the response id=" + id);
     97 
     98    response.processAsync();
     99    response.setHeader("X-ID", id);
    100    responseQueue.push(response);
    101 
    102    if (responseQueue.length == maxConnections) {
    103      log("received all http requets");
    104      Services.obs.notifyObservers(null, "net:cancel-all-connections");
    105    }
    106  });
    107 
    108  registerCleanupFunction(function () {
    109    server.stop(serverStopListener);
    110  });
    111 }
    112 
    113 function run_test() {
    114  setup_http_server();
    115  setupHttpRequests(Cr.NS_ERROR_ABORT);
    116 }