test_throttling.js (1949B)
1 // Test nsIThrottledInputChannel interface. 2 "use strict"; 3 4 const { HttpServer } = ChromeUtils.importESModule( 5 "resource://testing-common/httpd.sys.mjs" 6 ); 7 8 function test_handler(metadata, response) { 9 const originalBody = "the response"; 10 response.setHeader("Content-Type", "text/html", false); 11 response.setStatusLine(metadata.httpVersion, 200, "OK"); 12 response.bodyOutputStream.write(originalBody, originalBody.length); 13 } 14 15 function make_channel(url) { 16 return NetUtil.newChannel({ 17 uri: url, 18 loadUsingSystemPrincipal: true, 19 }).QueryInterface(Ci.nsIHttpChannel); 20 } 21 22 function run_test() { 23 let httpserver = new HttpServer(); 24 httpserver.registerPathHandler("/testdir", test_handler); 25 httpserver.start(-1); 26 27 const PORT = httpserver.identity.primaryPort; 28 const size = 4096; 29 30 let sstream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance( 31 Ci.nsIStringInputStream 32 ); 33 sstream.setByteStringData("x".repeat(size)); 34 35 let mime = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance( 36 Ci.nsIMIMEInputStream 37 ); 38 mime.addHeader("Content-Type", "multipart/form-data; boundary=zzzzz"); 39 mime.setData(sstream); 40 41 let tq = Cc["@mozilla.org/network/throttlequeue;1"].createInstance( 42 Ci.nsIInputChannelThrottleQueue 43 ); 44 // Make sure the request takes more than one read. 45 tq.init(100 + size / 2, 100 + size / 2); 46 47 let channel = make_channel("http://localhost:" + PORT + "/testdir"); 48 channel 49 .QueryInterface(Ci.nsIUploadChannel) 50 .setUploadStream(mime, "", mime.available()); 51 channel.requestMethod = "POST"; 52 53 let tic = channel.QueryInterface(Ci.nsIThrottledInputChannel); 54 tic.throttleQueue = tq; 55 56 let startTime = Date.now(); 57 channel.asyncOpen( 58 new ChannelListener(() => { 59 Assert.greater( 60 Date.now() - startTime, 61 1000, 62 "request took more than one second" 63 ); 64 65 httpserver.stop(do_test_finished); 66 }) 67 ); 68 69 do_test_pending(); 70 }