test_bug596443.js (2896B)
1 "use strict"; 2 3 const { HttpServer } = ChromeUtils.importESModule( 4 "resource://testing-common/httpd.sys.mjs" 5 ); 6 7 var httpProtocolHandler = Cc[ 8 "@mozilla.org/network/protocol;1?name=http" 9 ].getService(Ci.nsIHttpProtocolHandler); 10 11 var httpserver = new HttpServer(); 12 13 var expectedOnStopRequests = 3; 14 15 function setupChannel(suffix, xRequest, flags) { 16 var chan = NetUtil.newChannel({ 17 uri: "http://localhost:" + httpserver.identity.primaryPort + suffix, 18 loadUsingSystemPrincipal: true, 19 }); 20 if (flags) { 21 chan.loadFlags |= flags; 22 } 23 24 var httpChan = chan.QueryInterface(Ci.nsIHttpChannel); 25 httpChan.setRequestHeader("x-request", xRequest, false); 26 27 return httpChan; 28 } 29 30 function Listener(response) { 31 this._response = response; 32 } 33 Listener.prototype = { 34 _response: null, 35 _buffer: null, 36 37 QueryInterface: ChromeUtils.generateQI([ 38 "nsIStreamListener", 39 "nsIRequestObserver", 40 ]), 41 42 onStartRequest() { 43 this._buffer = ""; 44 }, 45 onDataAvailable(request, stream, offset, count) { 46 this._buffer = this._buffer.concat(read_stream(stream, count)); 47 }, 48 onStopRequest() { 49 Assert.equal(this._buffer, this._response); 50 if (--expectedOnStopRequests == 0) { 51 do_timeout(10, function () { 52 httpserver.stop(do_test_finished); 53 }); 54 } 55 }, 56 }; 57 58 function run_test() { 59 httpserver.registerPathHandler("/bug596443", handler); 60 httpserver.start(-1); 61 62 Services.prefs.setBoolPref("network.http.rcwn.enabled", false); 63 64 // make sure we have a profile so we can use the disk-cache 65 do_get_profile(); 66 67 // clear cache 68 evict_cache_entries(); 69 70 httpProtocolHandler.EnsureHSTSDataReady().then(function () { 71 var ch0 = setupChannel( 72 "/bug596443", 73 "Response0", 74 Ci.nsIRequest.LOAD_BYPASS_CACHE 75 ); 76 ch0.asyncOpen(new Listener("Response0")); 77 78 var ch1 = setupChannel( 79 "/bug596443", 80 "Response1", 81 Ci.nsIRequest.LOAD_BYPASS_CACHE 82 ); 83 ch1.asyncOpen(new Listener("Response1")); 84 85 var ch2 = setupChannel("/bug596443", "Should not be used"); 86 ch2.asyncOpen(new Listener("Response1")); // Note param: we expect this to come from cache 87 }); 88 89 do_test_pending(); 90 } 91 92 function triggerHandlers() { 93 do_timeout(100, handlers[1]); 94 do_timeout(100, handlers[0]); 95 } 96 97 var handlers = []; 98 function handler(metadata, response) { 99 var func = function (body) { 100 return function () { 101 response.setStatusLine(metadata.httpVersion, 200, "Ok"); 102 response.setHeader("Content-Type", "text/plain", false); 103 response.setHeader("Content-Length", "" + body.length, false); 104 response.setHeader("Cache-Control", "max-age=600", false); 105 response.bodyOutputStream.write(body, body.length); 106 response.finish(); 107 }; 108 }; 109 110 response.processAsync(); 111 var request = metadata.getHeader("x-request"); 112 handlers.push(func(request)); 113 114 if (handlers.length > 1) { 115 triggerHandlers(); 116 } 117 }