1 /* this test does the following:
2 Always requests the same resource, while for each request getting:
4 2. 401 followed by 200 + ETag: "two"
6 4. 407 followed by 200 + ETag: "three"
12 const { HttpServer } = ChromeUtils.importESModule(
13 "resource://testing-common/httpd.sys.mjs"
18 function addCreds(scheme, host) {
19 var authMgr = Cc["@mozilla.org/network/http-auth-manager;1"].getService(
22 authMgr.setAuthIdentity(
25 httpserv.identity.primaryPort,
35 function clearCreds() {
36 var authMgr = Cc["@mozilla.org/network/http-auth-manager;1"].getService(
43 return NetUtil.newChannel({
44 uri: "http://localhost:" + httpserv.identity.primaryPort + "/",
45 loadUsingSystemPrincipal: true,
46 }).QueryInterface(Ci.nsIHttpChannel);
49 // Array of handlers that are called one by one in response to expected requests
53 function (metadata, response) {
54 Assert.equal(metadata.hasHeader("Authorization"), false);
55 response.setStatusLine(metadata.httpVersion, 200, "OK");
56 response.setHeader("ETag", '"one"', false);
57 response.setHeader("Cache-control", "no-cache", false);
58 response.setHeader("Content-type", "text/plain", false);
59 var body = "Response body 1";
60 response.bodyOutputStream.write(body, body.length);
64 function (metadata, response) {
65 Assert.equal(metadata.hasHeader("Authorization"), false);
66 Assert.equal(metadata.getHeader("If-None-Match"), '"one"');
67 response.setStatusLine(metadata.httpVersion, 401, "Authenticate");
68 response.setHeader("WWW-Authenticate", 'Basic realm="secret"', false);
69 addCreds("http", "localhost");
71 function (metadata, response) {
72 Assert.equal(metadata.hasHeader("Authorization"), true);
73 response.setStatusLine(metadata.httpVersion, 200, "OK");
74 response.setHeader("ETag", '"two"', false);
75 response.setHeader("Cache-control", "no-cache", false);
76 response.setHeader("Content-type", "text/plain", false);
77 var body = "Response body 2";
78 response.bodyOutputStream.write(body, body.length);
83 function (metadata, response) {
84 Assert.equal(metadata.hasHeader("Authorization"), false);
85 Assert.equal(metadata.getHeader("If-None-Match"), '"two"');
86 response.setStatusLine(metadata.httpVersion, 401, "Authenticate");
87 response.setHeader("WWW-Authenticate", 'Basic realm="secret"', false);
88 addCreds("http", "localhost");
90 function (metadata, response) {
91 Assert.equal(metadata.hasHeader("Authorization"), true);
92 Assert.equal(metadata.getHeader("If-None-Match"), '"two"');
93 response.setStatusLine(metadata.httpVersion, 304, "OK");
94 response.setHeader("ETag", '"two"', false);
99 function (metadata, response) {
100 Assert.equal(metadata.hasHeader("Authorization"), false);
101 Assert.equal(metadata.getHeader("If-None-Match"), '"two"');
102 response.setStatusLine(metadata.httpVersion, 407, "Proxy Authenticate");
103 response.setHeader("Proxy-Authenticate", 'Basic realm="secret"', false);
104 addCreds("http", "localhost");
106 function (metadata, response) {
107 Assert.equal(metadata.hasHeader("Proxy-Authorization"), true);
108 Assert.equal(metadata.getHeader("If-None-Match"), '"two"');
109 response.setStatusLine(metadata.httpVersion, 200, "OK");
110 response.setHeader("ETag", '"three"', false);
111 response.setHeader("Cache-control", "no-cache", false);
112 response.setHeader("Content-type", "text/plain", false);
113 var body = "Response body 3";
114 response.bodyOutputStream.write(body, body.length);
119 function (metadata, response) {
120 Assert.equal(metadata.hasHeader("Proxy-Authorization"), false);
121 Assert.equal(metadata.getHeader("If-None-Match"), '"three"');
122 response.setStatusLine(metadata.httpVersion, 407, "Proxy Authenticate");
123 response.setHeader("Proxy-Authenticate", 'Basic realm="secret"', false);
124 addCreds("http", "localhost");
126 function (metadata, response) {
127 Assert.equal(metadata.hasHeader("Proxy-Authorization"), true);
128 Assert.equal(metadata.getHeader("If-None-Match"), '"three"');
129 response.setStatusLine(metadata.httpVersion, 304, "OK");
130 response.setHeader("ETag", '"three"', false);
131 response.setHeader("Cache-control", "no-cache", false);
136 function handler(metadata, response) {
137 handlers.shift()(metadata, response);
140 // Array of tests to run, self-driven
142 function sync_and_run_next_test() {
143 syncWithCacheIOThread(function () {
149 // Test 1: 200 (cacheable)
154 function (req, body) {
155 Assert.equal(body, "Response body 1");
156 sync_and_run_next_test();
164 // Test 2: 401 and 200 + new content
169 function (req, body) {
170 Assert.equal(body, "Response body 2");
171 sync_and_run_next_test();
179 // Test 3: 401 and 304
184 function (req, body) {
185 Assert.equal(body, "Response body 2");
186 sync_and_run_next_test();
194 // Test 4: 407 and 200 + new content
199 function (req, body) {
200 Assert.equal(body, "Response body 3");
201 sync_and_run_next_test();
209 // Test 5: 407 and 304
214 function (req, body) {
215 Assert.equal(body, "Response body 3");
216 sync_and_run_next_test();
226 httpserv.stop(do_test_finished);
230 function run_test() {
233 httpserv = new HttpServer();
234 httpserv.registerPathHandler("/", handler);
237 const prefs = Services.prefs;
238 prefs.setCharPref("network.proxy.http", "localhost");
239 prefs.setIntPref("network.proxy.http_port", httpserv.identity.primaryPort);
240 prefs.setBoolPref("network.proxy.allow_hijacking_localhost", true);
241 prefs.setIntPref("network.proxy.type", 1);
242 prefs.setBoolPref("network.http.rcwn.enabled", false);