tor-browser

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

test_post.js (3564B)


      1 //
      2 // POST test
      3 //
      4 
      5 "use strict";
      6 
      7 const { HttpServer } = ChromeUtils.importESModule(
      8  "resource://testing-common/httpd.sys.mjs"
      9 );
     10 
     11 ChromeUtils.defineLazyGetter(this, "URL", function () {
     12  return "http://localhost:" + httpserver.identity.primaryPort;
     13 });
     14 
     15 var httpserver = new HttpServer();
     16 var testpath = "/simple";
     17 
     18 var testfile = do_get_file("../unit/data/test_readline6.txt");
     19 
     20 const BOUNDARY = "AaB03x";
     21 var teststring1 =
     22  "--" +
     23  BOUNDARY +
     24  "\r\n" +
     25  'Content-Disposition: form-data; name="body"\r\n\r\n' +
     26  "0123456789\r\n" +
     27  "--" +
     28  BOUNDARY +
     29  "\r\n" +
     30  'Content-Disposition: form-data; name="files"; filename="' +
     31  testfile.leafName +
     32  '"\r\n' +
     33  "Content-Type: application/octet-stream\r\n" +
     34  "Content-Length: " +
     35  testfile.fileSize +
     36  "\r\n\r\n";
     37 var teststring2 = "--" + BOUNDARY + "--\r\n";
     38 
     39 const BUFFERSIZE = 4096;
     40 var correctOnProgress = false;
     41 
     42 var listenerCallback = {
     43  QueryInterface: ChromeUtils.generateQI(["nsIProgressEventSink"]),
     44 
     45  getInterface(iid) {
     46    if (iid.equals(Ci.nsIProgressEventSink)) {
     47      return this;
     48    }
     49    throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
     50  },
     51 
     52  onProgress(request, progress, progressMax) {
     53    // this works because the response is 0 bytes and does not trigger onprogress
     54    if (progress === progressMax) {
     55      correctOnProgress = true;
     56    }
     57  },
     58 
     59  onStatus() {},
     60 };
     61 
     62 function run_test() {
     63  var sstream1 = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
     64    Ci.nsIStringInputStream
     65  );
     66  sstream1.setByteStringData(teststring1);
     67 
     68  var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
     69    Ci.nsIFileInputStream
     70  );
     71  fstream.init(testfile, -1, -1, 0);
     72 
     73  var buffered = Cc[
     74    "@mozilla.org/network/buffered-input-stream;1"
     75  ].createInstance(Ci.nsIBufferedInputStream);
     76  buffered.init(fstream, BUFFERSIZE);
     77 
     78  var sstream2 = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
     79    Ci.nsIStringInputStream
     80  );
     81  sstream2.setByteStringData(teststring2);
     82 
     83  var multi = Cc["@mozilla.org/io/multiplex-input-stream;1"].createInstance(
     84    Ci.nsIMultiplexInputStream
     85  );
     86  multi.appendStream(sstream1);
     87  multi.appendStream(buffered);
     88  multi.appendStream(sstream2);
     89 
     90  var mime = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(
     91    Ci.nsIMIMEInputStream
     92  );
     93  mime.addHeader("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
     94  mime.setData(multi);
     95 
     96  httpserver.registerPathHandler(testpath, serverHandler);
     97  httpserver.start(-1);
     98 
     99  var channel = setupChannel(testpath);
    100 
    101  channel
    102    .QueryInterface(Ci.nsIUploadChannel)
    103    .setUploadStream(mime, "", mime.available());
    104  channel.requestMethod = "POST";
    105  channel.notificationCallbacks = listenerCallback;
    106  channel.asyncOpen(new ChannelListener(checkRequest, channel));
    107  do_test_pending();
    108 }
    109 
    110 function setupChannel(path) {
    111  return NetUtil.newChannel({
    112    uri: URL + path,
    113    loadUsingSystemPrincipal: true,
    114  }).QueryInterface(Ci.nsIHttpChannel);
    115 }
    116 
    117 function serverHandler(metadata) {
    118  Assert.equal(metadata.method, "POST");
    119 
    120  var data = read_stream(
    121    metadata.bodyInputStream,
    122    metadata.bodyInputStream.available()
    123  );
    124 
    125  var testfile_stream = Cc[
    126    "@mozilla.org/network/file-input-stream;1"
    127  ].createInstance(Ci.nsIFileInputStream);
    128  testfile_stream.init(testfile, -1, -1, 0);
    129 
    130  Assert.equal(
    131    teststring1 +
    132      read_stream(testfile_stream, testfile_stream.available()) +
    133      teststring2,
    134    data
    135  );
    136 }
    137 
    138 function checkRequest() {
    139  Assert.ok(correctOnProgress);
    140  httpserver.stop(do_test_finished);
    141 }