tor-browser

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

test_head.js (5269B)


      1 //
      2 //  HTTP headers test
      3 //
      4 
      5 // Note: sets Cc and Ci variables
      6 
      7 "use strict";
      8 
      9 const { HttpServer } = ChromeUtils.importESModule(
     10  "resource://testing-common/httpd.sys.mjs"
     11 );
     12 const ReferrerInfo = Components.Constructor(
     13  "@mozilla.org/referrer-info;1",
     14  "nsIReferrerInfo",
     15  "init"
     16 );
     17 
     18 ChromeUtils.defineLazyGetter(this, "URL", function () {
     19  return "http://localhost:" + httpserver.identity.primaryPort;
     20 });
     21 
     22 var httpserver = new HttpServer();
     23 var testpath = "/simple";
     24 var httpbody = "0123456789";
     25 var channel;
     26 
     27 var dbg = 0;
     28 if (dbg) {
     29  print("============== START ==========");
     30 }
     31 
     32 function run_test() {
     33  setup_test();
     34  do_test_pending();
     35 }
     36 
     37 function setup_test() {
     38  if (dbg) {
     39    print("============== setup_test: in");
     40  }
     41 
     42  httpserver.registerPathHandler(testpath, serverHandler);
     43  httpserver.start(-1);
     44 
     45  channel = setupChannel(testpath);
     46 
     47  channel.setRequestHeader("ReplaceMe", "initial value", true);
     48  var setOK = channel.getRequestHeader("ReplaceMe");
     49  Assert.equal(setOK, "initial value");
     50  channel.setRequestHeader("ReplaceMe", "replaced", false);
     51  setOK = channel.getRequestHeader("ReplaceMe");
     52  Assert.equal(setOK, "replaced");
     53 
     54  channel.setRequestHeader("MergeMe", "foo1", true);
     55  channel.setRequestHeader("MergeMe", "foo2", true);
     56  channel.setRequestHeader("MergeMe", "foo3", true);
     57  setOK = channel.getRequestHeader("MergeMe");
     58  Assert.equal(setOK, "foo1, foo2, foo3");
     59 
     60  channel.setEmptyRequestHeader("Empty");
     61  setOK = channel.getRequestHeader("Empty");
     62  Assert.equal(setOK, "");
     63 
     64  channel.setRequestHeader("ReplaceWithEmpty", "initial value", true);
     65  setOK = channel.getRequestHeader("ReplaceWithEmpty");
     66  Assert.equal(setOK, "initial value");
     67  channel.setEmptyRequestHeader("ReplaceWithEmpty");
     68  setOK = channel.getRequestHeader("ReplaceWithEmpty");
     69  Assert.equal(setOK, "");
     70 
     71  channel.setEmptyRequestHeader("MergeWithEmpty");
     72  setOK = channel.getRequestHeader("MergeWithEmpty");
     73  Assert.equal(setOK, "");
     74  channel.setRequestHeader("MergeWithEmpty", "foo", true);
     75  setOK = channel.getRequestHeader("MergeWithEmpty");
     76  Assert.equal(setOK, "foo");
     77 
     78  var uri = NetUtil.newURI("http://foo1.invalid:80");
     79  channel.referrerInfo = new ReferrerInfo(Ci.nsIReferrerInfo.EMPTY, true, uri);
     80  setOK = channel.getRequestHeader("Referer");
     81  Assert.equal(setOK, "http://foo1.invalid/");
     82 
     83  uri = NetUtil.newURI("http://foo2.invalid:90/bar");
     84  channel.referrerInfo = new ReferrerInfo(Ci.nsIReferrerInfo.EMPTY, true, uri);
     85  setOK = channel.getRequestHeader("Referer");
     86  // No triggering URI inloadInfo, assume load is cross-origin.
     87  Assert.equal(setOK, "http://foo2.invalid:90/");
     88 
     89  // ChannelListener defined in head_channels.js
     90  channel.asyncOpen(new ChannelListener(checkRequestResponse, channel));
     91 
     92  if (dbg) {
     93    print("============== setup_test: out");
     94  }
     95 }
     96 
     97 function setupChannel(path) {
     98  var chan = NetUtil.newChannel({
     99    uri: URL + path,
    100    loadUsingSystemPrincipal: true,
    101  });
    102  chan.QueryInterface(Ci.nsIHttpChannel);
    103  chan.requestMethod = "GET";
    104  return chan;
    105 }
    106 
    107 function serverHandler(metadata, response) {
    108  if (dbg) {
    109    print("============== serverHandler: in");
    110  }
    111 
    112  var setOK = metadata.getHeader("ReplaceMe");
    113  Assert.equal(setOK, "replaced");
    114  setOK = metadata.getHeader("MergeMe");
    115  Assert.equal(setOK, "foo1, foo2, foo3");
    116  setOK = metadata.getHeader("Empty");
    117  Assert.equal(setOK, "");
    118  setOK = metadata.getHeader("ReplaceWithEmpty");
    119  Assert.equal(setOK, "");
    120  setOK = metadata.getHeader("MergeWithEmpty");
    121  Assert.equal(setOK, "foo");
    122  setOK = metadata.getHeader("Referer");
    123  Assert.equal(setOK, "http://foo2.invalid:90/");
    124 
    125  response.setHeader("Content-Type", "text/plain", false);
    126  response.setStatusLine("1.1", 200, "OK");
    127 
    128  // note: httpd.js' "Response" class uses ',' (no space) for merge.
    129  response.setHeader("httpdMerge", "bar1", false);
    130  response.setHeader("httpdMerge", "bar2", true);
    131  response.setHeader("httpdMerge", "bar3", true);
    132  // Some special headers like Proxy-Authenticate merge with \n
    133  response.setHeader("Proxy-Authenticate", "line 1", true);
    134  response.setHeader("Proxy-Authenticate", "line 2", true);
    135  response.setHeader("Proxy-Authenticate", "line 3", true);
    136 
    137  response.bodyOutputStream.write(httpbody, httpbody.length);
    138 
    139  if (dbg) {
    140    print("============== serverHandler: out");
    141  }
    142 }
    143 
    144 function checkRequestResponse(request, data) {
    145  if (dbg) {
    146    print("============== checkRequestResponse: in");
    147  }
    148 
    149  Assert.equal(channel.responseStatus, 200);
    150  Assert.equal(channel.responseStatusText, "OK");
    151  Assert.ok(channel.requestSucceeded);
    152 
    153  var response = channel.getResponseHeader("httpdMerge");
    154  Assert.equal(response, "bar1,bar2,bar3");
    155  channel.setResponseHeader("httpdMerge", "bar", true);
    156  Assert.equal(channel.getResponseHeader("httpdMerge"), "bar1,bar2,bar3, bar");
    157 
    158  response = channel.getResponseHeader("Proxy-Authenticate");
    159  Assert.equal(response, "line 1\nline 2\nline 3");
    160 
    161  channel.contentCharset = "UTF-8";
    162  Assert.equal(channel.contentCharset, "UTF-8");
    163  Assert.equal(channel.contentType, "text/plain");
    164  Assert.equal(channel.contentLength, httpbody.length);
    165  Assert.equal(data, httpbody);
    166 
    167  httpserver.stop(do_test_finished);
    168  if (dbg) {
    169    print("============== checkRequestResponse: out");
    170  }
    171 }