test_bug536324_64bit_content_length.js (1624B)
1 /* Test to ensure our 64-bit content length implementation works, at least for 2 a simple HTTP case */ 3 4 "use strict"; 5 6 const { HttpServer } = ChromeUtils.importESModule( 7 "resource://testing-common/httpd.sys.mjs" 8 ); 9 10 // This C-L is significantly larger than (U)INT32_MAX, to make sure we do 11 // 64-bit properly. 12 const CONTENT_LENGTH = "1152921504606846975"; 13 14 var httpServer = null; 15 16 var listener = { 17 onStartRequest() {}, 18 19 onDataAvailable(req) { 20 Assert.equal(req.getResponseHeader("Content-Length"), CONTENT_LENGTH); 21 22 // We're done here, cancel the channel 23 req.cancel(Cr.NS_BINDING_ABORTED); 24 }, 25 26 onStopRequest() { 27 httpServer.stop(do_test_finished); 28 }, 29 }; 30 31 function hugeContentLength(metadata, response) { 32 var text = "abcdefghijklmnopqrstuvwxyz"; 33 var bytes_written = 0; 34 35 response.seizePower(); 36 37 response.write("HTTP/1.1 200 OK\r\n"); 38 response.write("Content-Length: " + CONTENT_LENGTH + "\r\n"); 39 response.write("Connection: close\r\n"); 40 response.write("\r\n"); 41 42 // Write enough data to ensure onDataAvailable gets called 43 while (bytes_written < 4096) { 44 response.write(text); 45 bytes_written += text.length; 46 } 47 48 response.finish(); 49 } 50 51 function test_hugeContentLength() { 52 var chan = NetUtil.newChannel({ 53 uri: "http://localhost:" + httpServer.identity.primaryPort + "/", 54 loadUsingSystemPrincipal: true, 55 }).QueryInterface(Ci.nsIHttpChannel); 56 chan.asyncOpen(listener); 57 } 58 59 add_test(test_hugeContentLength); 60 61 function run_test() { 62 httpServer = new HttpServer(); 63 httpServer.registerPathHandler("/", hugeContentLength); 64 httpServer.start(-1); 65 run_next_test(); 66 }