tor-browser

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

test_throttling.js (1949B)


      1 // Test nsIThrottledInputChannel interface.
      2 "use strict";
      3 
      4 const { HttpServer } = ChromeUtils.importESModule(
      5  "resource://testing-common/httpd.sys.mjs"
      6 );
      7 
      8 function test_handler(metadata, response) {
      9  const originalBody = "the response";
     10  response.setHeader("Content-Type", "text/html", false);
     11  response.setStatusLine(metadata.httpVersion, 200, "OK");
     12  response.bodyOutputStream.write(originalBody, originalBody.length);
     13 }
     14 
     15 function make_channel(url) {
     16  return NetUtil.newChannel({
     17    uri: url,
     18    loadUsingSystemPrincipal: true,
     19  }).QueryInterface(Ci.nsIHttpChannel);
     20 }
     21 
     22 function run_test() {
     23  let httpserver = new HttpServer();
     24  httpserver.registerPathHandler("/testdir", test_handler);
     25  httpserver.start(-1);
     26 
     27  const PORT = httpserver.identity.primaryPort;
     28  const size = 4096;
     29 
     30  let sstream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
     31    Ci.nsIStringInputStream
     32  );
     33  sstream.setByteStringData("x".repeat(size));
     34 
     35  let mime = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(
     36    Ci.nsIMIMEInputStream
     37  );
     38  mime.addHeader("Content-Type", "multipart/form-data; boundary=zzzzz");
     39  mime.setData(sstream);
     40 
     41  let tq = Cc["@mozilla.org/network/throttlequeue;1"].createInstance(
     42    Ci.nsIInputChannelThrottleQueue
     43  );
     44  // Make sure the request takes more than one read.
     45  tq.init(100 + size / 2, 100 + size / 2);
     46 
     47  let channel = make_channel("http://localhost:" + PORT + "/testdir");
     48  channel
     49    .QueryInterface(Ci.nsIUploadChannel)
     50    .setUploadStream(mime, "", mime.available());
     51  channel.requestMethod = "POST";
     52 
     53  let tic = channel.QueryInterface(Ci.nsIThrottledInputChannel);
     54  tic.throttleQueue = tq;
     55 
     56  let startTime = Date.now();
     57  channel.asyncOpen(
     58    new ChannelListener(() => {
     59      Assert.greater(
     60        Date.now() - startTime,
     61        1000,
     62        "request took more than one second"
     63      );
     64 
     65      httpserver.stop(do_test_finished);
     66    })
     67  );
     68 
     69  do_test_pending();
     70 }