tor-browser

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

test_304_headers.js (2529B)


      1 "use strict";
      2 
      3 const { HttpServer } = ChromeUtils.importESModule(
      4  "resource://testing-common/httpd.sys.mjs"
      5 );
      6 
      7 ChromeUtils.defineLazyGetter(this, "URL", function () {
      8  return `http://localhost:${httpServer.identity.primaryPort}/test`;
      9 });
     10 
     11 let httpServer = null;
     12 
     13 function make_channel(url) {
     14  return NetUtil.newChannel({
     15    uri: url,
     16    loadUsingSystemPrincipal: true,
     17  }).QueryInterface(Ci.nsIHttpChannel);
     18 }
     19 
     20 function contentHandler(metadata, response) {
     21  response.seizePower();
     22  let etag = "";
     23  try {
     24    etag = metadata.getHeader("If-None-Match");
     25  } catch (ex) {}
     26 
     27  if (etag == "test-etag1") {
     28    response.write("HTTP/1.1 304 Not Modified\r\n");
     29 
     30    response.write("Link: <ref>; param1=value1\r\n");
     31    response.write("Link: <ref2>; param2=value2\r\n");
     32    response.write("Link: <ref3>; param1=value1\r\n");
     33    response.write("\r\n");
     34    response.finish();
     35    return;
     36  }
     37 
     38  response.write("HTTP/1.1 200 OK\r\n");
     39 
     40  response.write("ETag: test-etag1\r\n");
     41  response.write("Link: <ref>; param1=value1\r\n");
     42  response.write("Link: <ref2>; param2=value2\r\n");
     43  response.write("Link: <ref3>; param1=value1\r\n");
     44  response.write("\r\n");
     45  response.finish();
     46 }
     47 
     48 add_task(async function test() {
     49  httpServer = new HttpServer();
     50  httpServer.registerPathHandler("/test", contentHandler);
     51  httpServer.start(-1);
     52  registerCleanupFunction(async () => {
     53    await httpServer.stop();
     54  });
     55 
     56  let chan = make_channel(Services.io.newURI(URL));
     57  chan.requestMethod = "HEAD";
     58  await new Promise(resolve => {
     59    chan.asyncOpen({
     60      onStopRequest(req, status) {
     61        equal(status, Cr.NS_OK);
     62        equal(req.QueryInterface(Ci.nsIHttpChannel).responseStatus, 200);
     63        equal(
     64          req.QueryInterface(Ci.nsIHttpChannel).getResponseHeader("Link"),
     65          "<ref>; param1=value1, <ref2>; param2=value2, <ref3>; param1=value1"
     66        );
     67        resolve();
     68      },
     69      onStartRequest() {},
     70      onDataAvailable() {},
     71    });
     72  });
     73 
     74  chan = make_channel(Services.io.newURI(URL));
     75  chan.requestMethod = "HEAD";
     76  await new Promise(resolve => {
     77    chan.asyncOpen({
     78      onStopRequest(req, status) {
     79        equal(status, Cr.NS_OK);
     80        equal(req.QueryInterface(Ci.nsIHttpChannel).responseStatus, 200);
     81        equal(
     82          req.QueryInterface(Ci.nsIHttpChannel).getResponseHeader("Link"),
     83          "<ref>; param1=value1, <ref2>; param2=value2, <ref3>; param1=value1"
     84        );
     85        resolve();
     86      },
     87      onStartRequest() {},
     88      onDataAvailable() {},
     89    });
     90  });
     91 });