tor-browser

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

test_307_redirect.js (2835B)


      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;
      9 });
     10 
     11 ChromeUtils.defineLazyGetter(this, "uri", function () {
     12  return URL + "/redirect";
     13 });
     14 
     15 ChromeUtils.defineLazyGetter(this, "noRedirectURI", function () {
     16  return URL + "/content";
     17 });
     18 
     19 var httpserver = null;
     20 
     21 function make_channel(url) {
     22  return NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true });
     23 }
     24 
     25 const requestBody = "request body";
     26 
     27 function redirectHandler(metadata, response) {
     28  response.setStatusLine(metadata.httpVersion, 307, "Moved Temporarily");
     29  response.setHeader("Location", noRedirectURI, false);
     30 }
     31 
     32 function contentHandler(metadata, response) {
     33  response.setHeader("Content-Type", "text/plain");
     34  response.bodyOutputStream.writeFrom(
     35    metadata.bodyInputStream,
     36    metadata.bodyInputStream.available()
     37  );
     38 }
     39 
     40 function noRedirectStreamObserver(request, buffer) {
     41  Assert.equal(buffer, requestBody);
     42  var chan = make_channel(uri);
     43  var uploadStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
     44    Ci.nsIStringInputStream
     45  );
     46  uploadStream.setByteStringData(requestBody);
     47  chan
     48    .QueryInterface(Ci.nsIUploadChannel)
     49    .setUploadStream(uploadStream, "text/plain", -1);
     50  chan.asyncOpen(new ChannelListener(noHeaderStreamObserver, null));
     51 }
     52 
     53 function noHeaderStreamObserver(request, buffer) {
     54  Assert.equal(buffer, requestBody);
     55  var chan = make_channel(uri);
     56  var uploadStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
     57    Ci.nsIStringInputStream
     58  );
     59  var streamBody =
     60    "Content-Type: text/plain\r\n" +
     61    "Content-Length: " +
     62    requestBody.length +
     63    "\r\n\r\n" +
     64    requestBody;
     65  uploadStream.setByteStringData(streamBody);
     66  chan
     67    .QueryInterface(Ci.nsIUploadChannel)
     68    .setUploadStream(uploadStream, "", -1);
     69  chan.asyncOpen(new ChannelListener(headerStreamObserver, null));
     70 }
     71 
     72 function headerStreamObserver(request, buffer) {
     73  Assert.equal(buffer, requestBody);
     74  httpserver.stop(do_test_finished);
     75 }
     76 
     77 function run_test() {
     78  httpserver = new HttpServer();
     79  httpserver.registerPathHandler("/redirect", redirectHandler);
     80  httpserver.registerPathHandler("/content", contentHandler);
     81  httpserver.start(-1);
     82 
     83  Services.prefs.setBoolPref("network.http.prompt-temp-redirect", false);
     84 
     85  var chan = make_channel(noRedirectURI);
     86  var uploadStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
     87    Ci.nsIStringInputStream
     88  );
     89  uploadStream.setByteStringData(requestBody);
     90  chan
     91    .QueryInterface(Ci.nsIUploadChannel)
     92    .setUploadStream(uploadStream, "text/plain", -1);
     93  chan.asyncOpen(new ChannelListener(noRedirectStreamObserver, null));
     94  do_test_pending();
     95 }