test_head.js (5269B)
1 // 2 // HTTP headers test 3 // 4 5 // Note: sets Cc and Ci variables 6 7 "use strict"; 8 9 const { HttpServer } = ChromeUtils.importESModule( 10 "resource://testing-common/httpd.sys.mjs" 11 ); 12 const ReferrerInfo = Components.Constructor( 13 "@mozilla.org/referrer-info;1", 14 "nsIReferrerInfo", 15 "init" 16 ); 17 18 ChromeUtils.defineLazyGetter(this, "URL", function () { 19 return "http://localhost:" + httpserver.identity.primaryPort; 20 }); 21 22 var httpserver = new HttpServer(); 23 var testpath = "/simple"; 24 var httpbody = "0123456789"; 25 var channel; 26 27 var dbg = 0; 28 if (dbg) { 29 print("============== START =========="); 30 } 31 32 function run_test() { 33 setup_test(); 34 do_test_pending(); 35 } 36 37 function setup_test() { 38 if (dbg) { 39 print("============== setup_test: in"); 40 } 41 42 httpserver.registerPathHandler(testpath, serverHandler); 43 httpserver.start(-1); 44 45 channel = setupChannel(testpath); 46 47 channel.setRequestHeader("ReplaceMe", "initial value", true); 48 var setOK = channel.getRequestHeader("ReplaceMe"); 49 Assert.equal(setOK, "initial value"); 50 channel.setRequestHeader("ReplaceMe", "replaced", false); 51 setOK = channel.getRequestHeader("ReplaceMe"); 52 Assert.equal(setOK, "replaced"); 53 54 channel.setRequestHeader("MergeMe", "foo1", true); 55 channel.setRequestHeader("MergeMe", "foo2", true); 56 channel.setRequestHeader("MergeMe", "foo3", true); 57 setOK = channel.getRequestHeader("MergeMe"); 58 Assert.equal(setOK, "foo1, foo2, foo3"); 59 60 channel.setEmptyRequestHeader("Empty"); 61 setOK = channel.getRequestHeader("Empty"); 62 Assert.equal(setOK, ""); 63 64 channel.setRequestHeader("ReplaceWithEmpty", "initial value", true); 65 setOK = channel.getRequestHeader("ReplaceWithEmpty"); 66 Assert.equal(setOK, "initial value"); 67 channel.setEmptyRequestHeader("ReplaceWithEmpty"); 68 setOK = channel.getRequestHeader("ReplaceWithEmpty"); 69 Assert.equal(setOK, ""); 70 71 channel.setEmptyRequestHeader("MergeWithEmpty"); 72 setOK = channel.getRequestHeader("MergeWithEmpty"); 73 Assert.equal(setOK, ""); 74 channel.setRequestHeader("MergeWithEmpty", "foo", true); 75 setOK = channel.getRequestHeader("MergeWithEmpty"); 76 Assert.equal(setOK, "foo"); 77 78 var uri = NetUtil.newURI("http://foo1.invalid:80"); 79 channel.referrerInfo = new ReferrerInfo(Ci.nsIReferrerInfo.EMPTY, true, uri); 80 setOK = channel.getRequestHeader("Referer"); 81 Assert.equal(setOK, "http://foo1.invalid/"); 82 83 uri = NetUtil.newURI("http://foo2.invalid:90/bar"); 84 channel.referrerInfo = new ReferrerInfo(Ci.nsIReferrerInfo.EMPTY, true, uri); 85 setOK = channel.getRequestHeader("Referer"); 86 // No triggering URI inloadInfo, assume load is cross-origin. 87 Assert.equal(setOK, "http://foo2.invalid:90/"); 88 89 // ChannelListener defined in head_channels.js 90 channel.asyncOpen(new ChannelListener(checkRequestResponse, channel)); 91 92 if (dbg) { 93 print("============== setup_test: out"); 94 } 95 } 96 97 function setupChannel(path) { 98 var chan = NetUtil.newChannel({ 99 uri: URL + path, 100 loadUsingSystemPrincipal: true, 101 }); 102 chan.QueryInterface(Ci.nsIHttpChannel); 103 chan.requestMethod = "GET"; 104 return chan; 105 } 106 107 function serverHandler(metadata, response) { 108 if (dbg) { 109 print("============== serverHandler: in"); 110 } 111 112 var setOK = metadata.getHeader("ReplaceMe"); 113 Assert.equal(setOK, "replaced"); 114 setOK = metadata.getHeader("MergeMe"); 115 Assert.equal(setOK, "foo1, foo2, foo3"); 116 setOK = metadata.getHeader("Empty"); 117 Assert.equal(setOK, ""); 118 setOK = metadata.getHeader("ReplaceWithEmpty"); 119 Assert.equal(setOK, ""); 120 setOK = metadata.getHeader("MergeWithEmpty"); 121 Assert.equal(setOK, "foo"); 122 setOK = metadata.getHeader("Referer"); 123 Assert.equal(setOK, "http://foo2.invalid:90/"); 124 125 response.setHeader("Content-Type", "text/plain", false); 126 response.setStatusLine("1.1", 200, "OK"); 127 128 // note: httpd.js' "Response" class uses ',' (no space) for merge. 129 response.setHeader("httpdMerge", "bar1", false); 130 response.setHeader("httpdMerge", "bar2", true); 131 response.setHeader("httpdMerge", "bar3", true); 132 // Some special headers like Proxy-Authenticate merge with \n 133 response.setHeader("Proxy-Authenticate", "line 1", true); 134 response.setHeader("Proxy-Authenticate", "line 2", true); 135 response.setHeader("Proxy-Authenticate", "line 3", true); 136 137 response.bodyOutputStream.write(httpbody, httpbody.length); 138 139 if (dbg) { 140 print("============== serverHandler: out"); 141 } 142 } 143 144 function checkRequestResponse(request, data) { 145 if (dbg) { 146 print("============== checkRequestResponse: in"); 147 } 148 149 Assert.equal(channel.responseStatus, 200); 150 Assert.equal(channel.responseStatusText, "OK"); 151 Assert.ok(channel.requestSucceeded); 152 153 var response = channel.getResponseHeader("httpdMerge"); 154 Assert.equal(response, "bar1,bar2,bar3"); 155 channel.setResponseHeader("httpdMerge", "bar", true); 156 Assert.equal(channel.getResponseHeader("httpdMerge"), "bar1,bar2,bar3, bar"); 157 158 response = channel.getResponseHeader("Proxy-Authenticate"); 159 Assert.equal(response, "line 1\nline 2\nline 3"); 160 161 channel.contentCharset = "UTF-8"; 162 Assert.equal(channel.contentCharset, "UTF-8"); 163 Assert.equal(channel.contentType, "text/plain"); 164 Assert.equal(channel.contentLength, httpbody.length); 165 Assert.equal(data, httpbody); 166 167 httpserver.stop(do_test_finished); 168 if (dbg) { 169 print("============== checkRequestResponse: out"); 170 } 171 }