michael@0: /* this test does the following: michael@0: Always requests the same resource, while for each request getting: michael@0: 1. 200 + ETag: "one" michael@0: 2. 401 followed by 200 + ETag: "two" michael@0: 3. 401 followed by 304 michael@0: 4. 407 followed by 200 + ETag: "three" michael@0: 5. 407 followed by 304 michael@0: */ michael@0: michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: var httpserv; michael@0: michael@0: function addCreds(scheme, host) michael@0: { michael@0: var authMgr = Components.classes['@mozilla.org/network/http-auth-manager;1'] michael@0: .getService(Ci.nsIHttpAuthManager); michael@0: authMgr.setAuthIdentity(scheme, host, httpserv.identity.primaryPort, michael@0: "basic", "secret", "/", "", "user", "pass"); michael@0: } michael@0: michael@0: function clearCreds() michael@0: { michael@0: var authMgr = Components.classes['@mozilla.org/network/http-auth-manager;1'] michael@0: .getService(Ci.nsIHttpAuthManager); michael@0: authMgr.clearAll(); michael@0: } michael@0: michael@0: function makeChan() { michael@0: var ios = Cc["@mozilla.org/network/io-service;1"] michael@0: .getService(Ci.nsIIOService); michael@0: var chan = ios.newChannel("http://localhost:" + michael@0: httpserv.identity.primaryPort + "/", null, null) michael@0: .QueryInterface(Ci.nsIHttpChannel); michael@0: return chan; michael@0: } michael@0: michael@0: // Array of handlers that are called one by one in response to expected requests michael@0: michael@0: var handlers = [ michael@0: // Test 1 michael@0: function(metadata, response) { michael@0: do_check_eq(metadata.hasHeader("Authorization"), false); michael@0: response.setStatusLine(metadata.httpVersion, 200, "OK"); michael@0: response.setHeader("ETag", '"one"', false); michael@0: response.setHeader("Cache-control", 'no-cache', false); michael@0: response.setHeader("Content-type", 'text/plain', false); michael@0: var body = "Response body 1"; michael@0: response.bodyOutputStream.write(body, body.length); michael@0: }, michael@0: michael@0: // Test 2 michael@0: function(metadata, response) { michael@0: do_check_eq(metadata.hasHeader("Authorization"), false); michael@0: do_check_eq(metadata.getHeader("If-None-Match"), '"one"'); michael@0: response.setStatusLine(metadata.httpVersion, 401, "Authenticate"); michael@0: response.setHeader("WWW-Authenticate", 'Basic realm="secret"', false); michael@0: addCreds("http", "localhost"); michael@0: }, michael@0: function(metadata, response) { michael@0: do_check_eq(metadata.hasHeader("Authorization"), true); michael@0: response.setStatusLine(metadata.httpVersion, 200, "OK"); michael@0: response.setHeader("ETag", '"two"', false); michael@0: response.setHeader("Cache-control", 'no-cache', false); michael@0: response.setHeader("Content-type", 'text/plain', false); michael@0: var body = "Response body 2"; michael@0: response.bodyOutputStream.write(body, body.length); michael@0: clearCreds(); michael@0: }, michael@0: michael@0: // Test 3 michael@0: function(metadata, response) { michael@0: do_check_eq(metadata.hasHeader("Authorization"), false); michael@0: do_check_eq(metadata.getHeader("If-None-Match"), '"two"'); michael@0: response.setStatusLine(metadata.httpVersion, 401, "Authenticate"); michael@0: response.setHeader("WWW-Authenticate", 'Basic realm="secret"', false); michael@0: addCreds("http", "localhost"); michael@0: }, michael@0: function(metadata, response) { michael@0: do_check_eq(metadata.hasHeader("Authorization"), true); michael@0: do_check_eq(metadata.getHeader("If-None-Match"), '"two"'); michael@0: response.setStatusLine(metadata.httpVersion, 304, "OK"); michael@0: response.setHeader("ETag", '"two"', false); michael@0: clearCreds(); michael@0: }, michael@0: michael@0: // Test 4 michael@0: function(metadata, response) { michael@0: do_check_eq(metadata.hasHeader("Authorization"), false); michael@0: do_check_eq(metadata.getHeader("If-None-Match"), '"two"'); michael@0: response.setStatusLine(metadata.httpVersion, 407, "Proxy Authenticate"); michael@0: response.setHeader("Proxy-Authenticate", 'Basic realm="secret"', false); michael@0: addCreds("http", "localhost"); michael@0: }, michael@0: function(metadata, response) { michael@0: do_check_eq(metadata.hasHeader("Proxy-Authorization"), true); michael@0: do_check_eq(metadata.getHeader("If-None-Match"), '"two"'); michael@0: response.setStatusLine(metadata.httpVersion, 200, "OK"); michael@0: response.setHeader("ETag", '"three"', false); michael@0: response.setHeader("Cache-control", 'no-cache', false); michael@0: response.setHeader("Content-type", 'text/plain', false); michael@0: var body = "Response body 3"; michael@0: response.bodyOutputStream.write(body, body.length); michael@0: clearCreds(); michael@0: }, michael@0: michael@0: // Test 5 michael@0: function(metadata, response) { michael@0: do_check_eq(metadata.hasHeader("Proxy-Authorization"), false); michael@0: do_check_eq(metadata.getHeader("If-None-Match"), '"three"'); michael@0: response.setStatusLine(metadata.httpVersion, 407, "Proxy Authenticate"); michael@0: response.setHeader("Proxy-Authenticate", 'Basic realm="secret"', false); michael@0: addCreds("http", "localhost"); michael@0: }, michael@0: function(metadata, response) { michael@0: do_check_eq(metadata.hasHeader("Proxy-Authorization"), true); michael@0: do_check_eq(metadata.getHeader("If-None-Match"), '"three"'); michael@0: response.setStatusLine(metadata.httpVersion, 304, "OK"); michael@0: response.setHeader("ETag", '"three"', false); michael@0: response.setHeader("Cache-control", 'no-cache', false); michael@0: clearCreds(); michael@0: } michael@0: ]; michael@0: michael@0: function handler(metadata, response) michael@0: { michael@0: handlers.shift()(metadata, response); michael@0: } michael@0: michael@0: // Array of tests to run, self-driven michael@0: michael@0: function sync_and_run_next_test() michael@0: { michael@0: syncWithCacheIOThread(function() { michael@0: tests.shift()(); michael@0: }); michael@0: } michael@0: michael@0: var tests = [ michael@0: // Test 1: 200 (cacheable) michael@0: function() { michael@0: var ch = makeChan(); michael@0: ch.asyncOpen(new ChannelListener(function(req, body) { michael@0: do_check_eq(body, "Response body 1"); michael@0: sync_and_run_next_test(); michael@0: }, null, CL_NOT_FROM_CACHE), null); michael@0: }, michael@0: michael@0: // Test 2: 401 and 200 + new content michael@0: function() { michael@0: var ch = makeChan(); michael@0: ch.asyncOpen(new ChannelListener(function(req, body) { michael@0: do_check_eq(body, "Response body 2"); michael@0: sync_and_run_next_test(); michael@0: }, null, CL_NOT_FROM_CACHE), null); michael@0: }, michael@0: michael@0: // Test 3: 401 and 304 michael@0: function() { michael@0: var ch = makeChan(); michael@0: ch.asyncOpen(new ChannelListener(function(req, body) { michael@0: do_check_eq(body, "Response body 2"); michael@0: sync_and_run_next_test(); michael@0: }, null, CL_FROM_CACHE), null); michael@0: }, michael@0: michael@0: // Test 4: 407 and 200 + new content michael@0: function() { michael@0: var ch = makeChan(); michael@0: ch.asyncOpen(new ChannelListener(function(req, body) { michael@0: do_check_eq(body, "Response body 3"); michael@0: sync_and_run_next_test(); michael@0: }, null, CL_NOT_FROM_CACHE), null); michael@0: }, michael@0: michael@0: // Test 5: 407 and 304 michael@0: function() { michael@0: var ch = makeChan(); michael@0: ch.asyncOpen(new ChannelListener(function(req, body) { michael@0: do_check_eq(body, "Response body 3"); michael@0: sync_and_run_next_test(); michael@0: }, null, CL_FROM_CACHE), null); michael@0: }, michael@0: michael@0: // End of test run michael@0: function() { michael@0: httpserv.stop(do_test_finished); michael@0: } michael@0: ]; michael@0: michael@0: function run_test() michael@0: { michael@0: do_get_profile(); michael@0: michael@0: httpserv = new HttpServer(); michael@0: httpserv.registerPathHandler("/", handler); michael@0: httpserv.start(-1); michael@0: michael@0: const prefs = Cc["@mozilla.org/preferences-service;1"] michael@0: .getService(Ci.nsIPrefBranch); michael@0: prefs.setCharPref("network.proxy.http", "localhost"); michael@0: prefs.setIntPref("network.proxy.http_port", httpserv.identity.primaryPort); michael@0: prefs.setCharPref("network.proxy.no_proxies_on", ""); michael@0: prefs.setIntPref("network.proxy.type", 1); michael@0: michael@0: tests.shift()(); michael@0: do_test_pending(); michael@0: }