test_bug1411316_http1.js (2929B)
1 // Test bug 1411316. 2 // 3 // Summary: 4 // The purpose of this test is to test whether the HttpConnectionMgr really 5 // cancel and close all connecitons when get "net:cancel-all-connections". 6 // 7 // Test step: 8 // 1. Create 6 http requests. Server would not process responses and just put 9 // all requests in its queue. 10 // 2. Once server receive all 6 requests, call notifyObservers with the 11 // topic "net:cancel-all-connections". 12 // 3. We expect that all 6 active connections should be closed with the status 13 // NS_ERROR_ABORT. 14 15 "use strict"; 16 17 const { HttpServer } = ChromeUtils.importESModule( 18 "resource://testing-common/httpd.sys.mjs" 19 ); 20 21 var server = new HttpServer(); 22 server.start(-1); 23 var baseURL = "http://localhost:" + server.identity.primaryPort + "/"; 24 var maxConnections = 0; 25 var debug = false; 26 var requestId = 0; 27 28 function log(msg) { 29 if (!debug) { 30 return; 31 } 32 33 if (msg) { 34 dump("TEST INFO | " + msg + "\n"); 35 } 36 } 37 38 function make_channel(url) { 39 var request = NetUtil.newChannel({ 40 uri: url, 41 loadUsingSystemPrincipal: true, 42 }); 43 request.QueryInterface(Ci.nsIHttpChannel); 44 return request; 45 } 46 47 function serverStopListener() { 48 server.stop(); 49 } 50 51 function createHttpRequest(status) { 52 let uri = baseURL; 53 var chan = make_channel(uri); 54 var listner = new HttpResponseListener(++requestId, status); 55 chan.setRequestHeader("X-ID", requestId, false); 56 chan.setRequestHeader("Cache-control", "no-store", false); 57 chan.asyncOpen(listner); 58 log("Create http request id=" + requestId); 59 } 60 61 function setupHttpRequests(status) { 62 log("setupHttpRequests"); 63 for (var i = 0; i < maxConnections; i++) { 64 createHttpRequest(status); 65 do_test_pending(); 66 } 67 } 68 69 function HttpResponseListener(id, onStopRequestStatus) { 70 this.id = id; 71 this.onStopRequestStatus = onStopRequestStatus; 72 } 73 74 HttpResponseListener.prototype = { 75 onStartRequest() {}, 76 77 onDataAvailable() {}, 78 79 onStopRequest(request, status) { 80 log("STOP id=" + this.id + " status=" + status); 81 Assert.equal(this.onStopRequestStatus, status); 82 do_test_finished(); 83 }, 84 }; 85 86 var responseQueue = []; 87 function setup_http_server() { 88 log("setup_http_server"); 89 maxConnections = Services.prefs.getIntPref( 90 "network.http.max-persistent-connections-per-server" 91 ); 92 93 // Start server; will be stopped at test cleanup time. 94 server.registerPathHandler("/", function (metadata, response) { 95 var id = metadata.getHeader("X-ID"); 96 log("Server recived the response id=" + id); 97 98 response.processAsync(); 99 response.setHeader("X-ID", id); 100 responseQueue.push(response); 101 102 if (responseQueue.length == maxConnections) { 103 log("received all http requets"); 104 Services.obs.notifyObservers(null, "net:cancel-all-connections"); 105 } 106 }); 107 108 registerCleanupFunction(function () { 109 server.stop(serverStopListener); 110 }); 111 } 112 113 function run_test() { 114 setup_http_server(); 115 setupHttpRequests(Cr.NS_ERROR_ABORT); 116 }