tor-browser

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

test_chunked_responses.js (5269B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 /*
      6 * Test Chunked-Encoded response parsing.
      7 */
      8 
      9 ////////////////////////////////////////////////////////////////////////////////
     10 // Test infrastructure
     11 
     12 "use strict";
     13 
     14 const { HttpServer } = ChromeUtils.importESModule(
     15  "resource://testing-common/httpd.sys.mjs"
     16 );
     17 
     18 ChromeUtils.defineLazyGetter(this, "URL", function () {
     19  return "http://localhost:" + httpserver.identity.primaryPort;
     20 });
     21 
     22 var httpserver = new HttpServer();
     23 var test_flags = [];
     24 var testPathBase = "/chunked_hdrs";
     25 
     26 function run_test() {
     27  httpserver.start(-1);
     28 
     29  do_test_pending();
     30  run_test_number(1);
     31 }
     32 
     33 function run_test_number(num) {
     34  var testPath = testPathBase + num;
     35  // eslint-disable-next-line no-eval
     36  httpserver.registerPathHandler(testPath, eval("handler" + num));
     37 
     38  var channel = setupChannel(testPath);
     39  var flags = test_flags[num]; // OK if flags undefined for test
     40  channel.asyncOpen(
     41    // eslint-disable-next-line no-eval
     42    new ChannelListener(eval("completeTest" + num), channel, flags)
     43  );
     44 }
     45 
     46 function setupChannel(url) {
     47  var chan = NetUtil.newChannel({
     48    uri: URL + url,
     49    loadUsingSystemPrincipal: true,
     50  });
     51  var httpChan = chan.QueryInterface(Ci.nsIHttpChannel);
     52  return httpChan;
     53 }
     54 
     55 function endTests() {
     56  httpserver.stop(do_test_finished);
     57 }
     58 
     59 ////////////////////////////////////////////////////////////////////////////////
     60 // Test 1: FAIL because of overflowed chunked size. The parser uses long so
     61 //         the test case uses >64bit to fail on all platforms.
     62 test_flags[1] = CL_EXPECT_LATE_FAILURE | CL_ALLOW_UNKNOWN_CL;
     63 
     64 // eslint-disable-next-line no-unused-vars
     65 function handler1(metadata, response) {
     66  var body = "12345678123456789\r\ndata never reached";
     67 
     68  response.seizePower();
     69  response.write("HTTP/1.1 200 OK\r\n");
     70  response.write("Content-Type: text/plain\r\n");
     71  response.write("Transfer-Encoding: chunked\r\n");
     72  response.write("\r\n");
     73  response.write(body);
     74  response.finish();
     75 }
     76 
     77 // eslint-disable-next-line no-unused-vars
     78 function completeTest1(request) {
     79  Assert.equal(request.status, Cr.NS_ERROR_UNEXPECTED);
     80 
     81  run_test_number(2);
     82 }
     83 
     84 ////////////////////////////////////////////////////////////////////////////////
     85 // Test 2: FAIL because of non-hex in chunked length
     86 
     87 test_flags[2] = CL_EXPECT_LATE_FAILURE | CL_ALLOW_UNKNOWN_CL;
     88 
     89 // eslint-disable-next-line no-unused-vars
     90 function handler2(metadata, response) {
     91  var body = "junkintheway 123\r\ndata never reached";
     92 
     93  response.seizePower();
     94  response.write("HTTP/1.1 200 OK\r\n");
     95  response.write("Content-Type: text/plain\r\n");
     96  response.write("Transfer-Encoding: chunked\r\n");
     97  response.write("\r\n");
     98  response.write(body);
     99  response.finish();
    100 }
    101 
    102 // eslint-disable-next-line no-unused-vars
    103 function completeTest2(request) {
    104  Assert.equal(request.status, Cr.NS_ERROR_UNEXPECTED);
    105  run_test_number(3);
    106 }
    107 
    108 ////////////////////////////////////////////////////////////////////////////////
    109 // Test 3: OK in spite of non-hex digits after size in the length field
    110 
    111 test_flags[3] = CL_ALLOW_UNKNOWN_CL;
    112 
    113 // eslint-disable-next-line no-unused-vars
    114 function handler3(metadata, response) {
    115  var body = "c junkafter\r\ndata reached\r\n0\r\n\r\n";
    116 
    117  response.seizePower();
    118  response.write("HTTP/1.1 200 OK\r\n");
    119  response.write("Content-Type: text/plain\r\n");
    120  response.write("Transfer-Encoding: chunked\r\n");
    121  response.write("\r\n");
    122  response.write(body);
    123  response.finish();
    124 }
    125 
    126 // eslint-disable-next-line no-unused-vars
    127 function completeTest3(request) {
    128  Assert.equal(request.status, 0);
    129  run_test_number(4);
    130 }
    131 
    132 ////////////////////////////////////////////////////////////////////////////////
    133 // Test 4: Verify a fully compliant chunked response.
    134 
    135 test_flags[4] = CL_ALLOW_UNKNOWN_CL;
    136 
    137 // eslint-disable-next-line no-unused-vars
    138 function handler4(metadata, response) {
    139  var body = "c\r\ndata reached\r\n3\r\nhej\r\n0\r\n\r\n";
    140 
    141  response.seizePower();
    142  response.write("HTTP/1.1 200 OK\r\n");
    143  response.write("Content-Type: text/plain\r\n");
    144  response.write("Transfer-Encoding: chunked\r\n");
    145  response.write("\r\n");
    146  response.write(body);
    147  response.finish();
    148 }
    149 
    150 // eslint-disable-next-line no-unused-vars
    151 function completeTest4(request) {
    152  Assert.equal(request.status, 0);
    153  run_test_number(5);
    154 }
    155 
    156 ////////////////////////////////////////////////////////////////////////////////
    157 // Test 5: A chunk size larger than 32 bit but smaller than 64bit also fails
    158 // This is probabaly subject to get improved at some point.
    159 
    160 test_flags[5] = CL_EXPECT_LATE_FAILURE | CL_ALLOW_UNKNOWN_CL;
    161 
    162 // eslint-disable-next-line no-unused-vars
    163 function handler5(metadata, response) {
    164  var body = "123456781\r\ndata never reached";
    165 
    166  response.seizePower();
    167  response.write("HTTP/1.1 200 OK\r\n");
    168  response.write("Content-Type: text/plain\r\n");
    169  response.write("Transfer-Encoding: chunked\r\n");
    170  response.write("\r\n");
    171  response.write(body);
    172  response.finish();
    173 }
    174 
    175 // eslint-disable-next-line no-unused-vars
    176 function completeTest5(request) {
    177  Assert.equal(request.status, Cr.NS_ERROR_UNEXPECTED);
    178  endTests();
    179  //  run_test_number(6);
    180 }