"use strict"; var prefs; var http2pref; var origin; var rcwnpref; function run_test() { var h2Port = Services.env.get("MOZHTTP2_PORT"); Assert.notEqual(h2Port, null); Assert.notEqual(h2Port, ""); // Set to allow the cert presented by our H2 server do_get_profile(); prefs = Services.prefs; http2pref = prefs.getBoolPref("network.http.http2.enabled"); rcwnpref = prefs.getBoolPref("network.http.rcwn.enabled"); prefs.setBoolPref("network.http.http2.enabled", true); prefs.setCharPref( "network.dns.localDomains", "foo.example.com, bar.example.com" ); // Disable rcwn to make cache behavior deterministic. prefs.setBoolPref("network.http.rcwn.enabled", false); // The moz-http2 cert is for foo.example.com and is signed by http2-ca.pem // so add that cert to the trust list as a signing cert. // the foo.example.com domain name. let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService( Ci.nsIX509CertDB ); addCertFromFile(certdb, "http2-ca.pem", "CTu,u,u"); origin = "https://foo.example.com:" + h2Port; dump("origin - " + origin + "\n"); doTest1(); } function resetPrefs() { prefs.setBoolPref("network.http.http2.enabled", http2pref); prefs.setBoolPref("network.http.rcwn.enabled", rcwnpref); prefs.clearUserPref("network.dns.localDomains"); } function makeChan(path) { return NetUtil.newChannel({ uri: origin + path, loadUsingSystemPrincipal: true, }).QueryInterface(Ci.nsIHttpChannel); } var nextTest; var expectPass = true; var expectConditional = false; var Listener = function () {}; Listener.prototype = { onStartRequest: function testOnStartRequest(request) { Assert.ok(request instanceof Ci.nsIHttpChannel); if (expectPass) { if (!Components.isSuccessCode(request.status)) { do_throw( "Channel should have a success code! (" + request.status + ")" ); } Assert.equal(request.responseStatus, 200); } else { Assert.equal(Components.isSuccessCode(request.status), false); } }, onDataAvailable: function testOnDataAvailable(request, stream, off, cnt) { read_stream(stream, cnt); }, onStopRequest: function testOnStopRequest(request) { if (expectConditional) { Assert.equal(request.getResponseHeader("x-conditional"), "true"); } else { try { Assert.notEqual(request.getResponseHeader("x-conditional"), "true"); } catch (e) { Assert.ok(true); } } nextTest(); do_test_finished(); }, }; function testsDone() { dump("testDone\n"); resetPrefs(); } function doTest1() { dump("execute doTest1 - resource without immutable. initial request\n"); do_test_pending(); expectConditional = false; var chan = makeChan("/immutable-test-without-attribute"); var listener = new Listener(); nextTest = doTest2; chan.asyncOpen(listener); } function doTest2() { dump("execute doTest2 - resource without immutable. reload\n"); do_test_pending(); expectConditional = true; var chan = makeChan("/immutable-test-without-attribute"); var listener = new Listener(); nextTest = doTest3; chan.loadFlags = Ci.nsIRequest.VALIDATE_ALWAYS; chan.asyncOpen(listener); } function doTest3() { dump("execute doTest3 - resource without immutable. shift reload\n"); do_test_pending(); expectConditional = false; var chan = makeChan("/immutable-test-without-attribute"); var listener = new Listener(); nextTest = doTest4; chan.loadFlags = Ci.nsIRequest.LOAD_BYPASS_CACHE; chan.asyncOpen(listener); } function doTest4() { dump("execute doTest4 - resource with immutable. initial request\n"); do_test_pending(); expectConditional = false; var chan = makeChan("/immutable-test-with-attribute"); var listener = new Listener(); nextTest = doTest5; chan.asyncOpen(listener); } function doTest5() { dump("execute doTest5 - resource with immutable. reload\n"); do_test_pending(); expectConditional = false; var chan = makeChan("/immutable-test-with-attribute"); var listener = new Listener(); nextTest = doTest6; chan.loadFlags = Ci.nsIRequest.VALIDATE_ALWAYS; chan.asyncOpen(listener); } function doTest6() { dump("execute doTest6 - resource with immutable. shift reload\n"); do_test_pending(); expectConditional = false; var chan = makeChan("/immutable-test-with-attribute"); var listener = new Listener(); nextTest = doTest7; chan.loadFlags = Ci.nsIRequest.LOAD_BYPASS_CACHE; chan.asyncOpen(listener); } function doTest7() { dump("execute doTest7 - expired resource with immutable. initial request\n"); do_test_pending(); expectConditional = false; var chan = makeChan("/immutable-test-expired-with-Expires-header"); var listener = new Listener(); nextTest = doTest8; chan.asyncOpen(listener); } function doTest8() { dump("execute doTest8 - expired resource with immutable. reload\n"); do_test_pending(); expectConditional = true; var chan = makeChan("/immutable-test-expired-with-Expires-header"); var listener = new Listener(); nextTest = doTest9; chan.loadFlags = Ci.nsIRequest.VALIDATE_ALWAYS; chan.asyncOpen(listener); } function doTest9() { dump( "execute doTest9 - expired resource with immutable cache extension and Last modified header. initial request\n" ); do_test_pending(); expectConditional = false; var chan = makeChan("/immutable-test-expired-with-last-modified-header"); var listener = new Listener(); nextTest = doTest10; chan.asyncOpen(listener); } function doTest10() { dump( "execute doTest10 - expired resource with immutable cache extension and Last modified heder. reload\n" ); do_test_pending(); expectConditional = true; var chan = makeChan("/immutable-test-expired-with-last-modified-header"); var listener = new Listener(); nextTest = testsDone; chan.loadFlags = Ci.nsIRequest.VALIDATE_ALWAYS; chan.asyncOpen(listener); }