/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; let trrServer = null; add_setup(async function setup() { if (Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) { return; } trr_test_setup(); Services.prefs.setBoolPref("network.dns.disablePrefetch", true); registerCleanupFunction(async () => { Services.prefs.clearUserPref("network.dns.disablePrefetch"); trr_clear_prefs(); }); trrServer = new TRRServer(); registerCleanupFunction(async () => { await trrServer.stop(); }); await trrServer.start(); Services.prefs.setCharPref( "network.trr.uri", `https://foo.example.com:${trrServer.port()}/dns-query` ); Services.prefs.setIntPref("network.trr.mode", Ci.nsIDNSService.MODE_TRRONLY); let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService( Ci.nsIX509CertDB ); addCertFromFile(certdb, "http2-ca.pem", "CTu,u,u"); // We need to define both A and AAAA responses, otherwise // we might race and pick up the skip reason for the other request. await trrServer.registerDoHAnswers(`myfoo.test`, "A", { answers: [], }); await trrServer.registerDoHAnswers(`myfoo.test`, "AAAA", { answers: [], }); // myfoo2.test will return sever error as it's not defined // return nxdomain for this one await trrServer.registerDoHAnswers(`myfoo3.test`, "A", { flags: 0x03, answers: [], }); await trrServer.registerDoHAnswers(`myfoo3.test`, "AAAA", { flags: 0x03, answers: [], }); await trrServer.registerDoHAnswers(`alt1.example.com`, "A", { answers: [ { name: "alt1.example.com", ttl: 55, type: "A", flush: false, data: "127.0.0.1", }, ], }); }); add_task(async function test_failure() { let req = await new Promise(resolve => { let chan = NetUtil.newChannel({ uri: `http://myfoo.test/`, loadUsingSystemPrincipal: true, }).QueryInterface(Ci.nsIHttpChannel); chan.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE)); }); equal(req.status, Cr.NS_ERROR_UNKNOWN_HOST); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).effectiveTRRMode, Ci.nsIRequest.TRR_ONLY_MODE ); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).trrSkipReason, Ci.nsITRRSkipReason.TRR_NO_ANSWERS ); req = await new Promise(resolve => { let chan = NetUtil.newChannel({ uri: `http://myfoo2.test/`, loadUsingSystemPrincipal: true, }).QueryInterface(Ci.nsIHttpChannel); chan.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE)); }); equal(req.status, Cr.NS_ERROR_UNKNOWN_HOST); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).effectiveTRRMode, Ci.nsIRequest.TRR_ONLY_MODE ); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).trrSkipReason, Ci.nsITRRSkipReason.TRR_RCODE_FAIL ); req = await new Promise(resolve => { let chan = NetUtil.newChannel({ uri: `http://myfoo3.test/`, loadUsingSystemPrincipal: true, }).QueryInterface(Ci.nsIHttpChannel); chan.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE)); }); equal(req.status, Cr.NS_ERROR_UNKNOWN_HOST); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).effectiveTRRMode, Ci.nsIRequest.TRR_ONLY_MODE ); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).trrSkipReason, Ci.nsITRRSkipReason.TRR_NXDOMAIN ); }); add_task(async function test_success() { let httpServer = new NodeHTTP2Server(); await httpServer.start(); await httpServer.registerPathHandler("/", (req, resp) => { resp.writeHead(200); resp.end("done"); }); registerCleanupFunction(async () => { await httpServer.stop(); }); let req = await new Promise(resolve => { let chan = NetUtil.newChannel({ uri: `https://alt1.example.com:${httpServer.port()}/`, loadUsingSystemPrincipal: true, }).QueryInterface(Ci.nsIHttpChannel); chan.asyncOpen(new ChannelListener(resolve, null, CL_ALLOW_UNKNOWN_CL)); }); equal(req.status, Cr.NS_OK); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).effectiveTRRMode, Ci.nsIRequest.TRR_ONLY_MODE ); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).trrSkipReason, Ci.nsITRRSkipReason.TRR_OK ); // Another request to check connection reuse req = await new Promise(resolve => { let chan = NetUtil.newChannel({ uri: `https://alt1.example.com:${httpServer.port()}/second`, loadUsingSystemPrincipal: true, }).QueryInterface(Ci.nsIHttpChannel); chan.asyncOpen(new ChannelListener(resolve, null, CL_ALLOW_UNKNOWN_CL)); }); equal(req.status, Cr.NS_OK); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).effectiveTRRMode, Ci.nsIRequest.TRR_ONLY_MODE ); equal( req.QueryInterface(Ci.nsIHttpChannelInternal).trrSkipReason, Ci.nsITRRSkipReason.TRR_OK ); });