test_307_redirect.js (2835B)
1 "use strict"; 2 3 const { HttpServer } = ChromeUtils.importESModule( 4 "resource://testing-common/httpd.sys.mjs" 5 ); 6 7 ChromeUtils.defineLazyGetter(this, "URL", function () { 8 return "http://localhost:" + httpserver.identity.primaryPort; 9 }); 10 11 ChromeUtils.defineLazyGetter(this, "uri", function () { 12 return URL + "/redirect"; 13 }); 14 15 ChromeUtils.defineLazyGetter(this, "noRedirectURI", function () { 16 return URL + "/content"; 17 }); 18 19 var httpserver = null; 20 21 function make_channel(url) { 22 return NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true }); 23 } 24 25 const requestBody = "request body"; 26 27 function redirectHandler(metadata, response) { 28 response.setStatusLine(metadata.httpVersion, 307, "Moved Temporarily"); 29 response.setHeader("Location", noRedirectURI, false); 30 } 31 32 function contentHandler(metadata, response) { 33 response.setHeader("Content-Type", "text/plain"); 34 response.bodyOutputStream.writeFrom( 35 metadata.bodyInputStream, 36 metadata.bodyInputStream.available() 37 ); 38 } 39 40 function noRedirectStreamObserver(request, buffer) { 41 Assert.equal(buffer, requestBody); 42 var chan = make_channel(uri); 43 var uploadStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance( 44 Ci.nsIStringInputStream 45 ); 46 uploadStream.setByteStringData(requestBody); 47 chan 48 .QueryInterface(Ci.nsIUploadChannel) 49 .setUploadStream(uploadStream, "text/plain", -1); 50 chan.asyncOpen(new ChannelListener(noHeaderStreamObserver, null)); 51 } 52 53 function noHeaderStreamObserver(request, buffer) { 54 Assert.equal(buffer, requestBody); 55 var chan = make_channel(uri); 56 var uploadStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance( 57 Ci.nsIStringInputStream 58 ); 59 var streamBody = 60 "Content-Type: text/plain\r\n" + 61 "Content-Length: " + 62 requestBody.length + 63 "\r\n\r\n" + 64 requestBody; 65 uploadStream.setByteStringData(streamBody); 66 chan 67 .QueryInterface(Ci.nsIUploadChannel) 68 .setUploadStream(uploadStream, "", -1); 69 chan.asyncOpen(new ChannelListener(headerStreamObserver, null)); 70 } 71 72 function headerStreamObserver(request, buffer) { 73 Assert.equal(buffer, requestBody); 74 httpserver.stop(do_test_finished); 75 } 76 77 function run_test() { 78 httpserver = new HttpServer(); 79 httpserver.registerPathHandler("/redirect", redirectHandler); 80 httpserver.registerPathHandler("/content", contentHandler); 81 httpserver.start(-1); 82 83 Services.prefs.setBoolPref("network.http.prompt-temp-redirect", false); 84 85 var chan = make_channel(noRedirectURI); 86 var uploadStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance( 87 Ci.nsIStringInputStream 88 ); 89 uploadStream.setByteStringData(requestBody); 90 chan 91 .QueryInterface(Ci.nsIUploadChannel) 92 .setUploadStream(uploadStream, "text/plain", -1); 93 chan.asyncOpen(new ChannelListener(noRedirectStreamObserver, null)); 94 do_test_pending(); 95 }