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 }