Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* 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({
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({
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({
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
);
});