зеркало из https://github.com/mozilla/gecko-dev.git
212 строки
6.3 KiB
JavaScript
212 строки
6.3 KiB
JavaScript
/* This test checks that a TRRServiceChannel can connect to the server with
|
|
a proxy.
|
|
Steps:
|
|
- Setup the proxy (PAC, proxy filter, and system proxy settings)
|
|
- Test when "network.trr.async_connInfo" is false. In this case, every
|
|
TRRServicChannel waits for the proxy info to be resolved.
|
|
- Test when "network.trr.async_connInfo" is true. In this case, every
|
|
TRRServicChannel uses an already created connection info to connect.
|
|
- The test test_trr_uri_change() is about checking if trr connection info
|
|
is updated correctly when trr uri changed.
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
/* import-globals-from trr_common.js */
|
|
|
|
let filter;
|
|
let systemProxySettings;
|
|
let trrProxy;
|
|
const pps = Cc["@mozilla.org/network/protocol-proxy-service;1"].getService();
|
|
|
|
function setup() {
|
|
h2Port = trr_test_setup();
|
|
runningODoHTests = false;
|
|
SetParentalControlEnabled(false);
|
|
}
|
|
|
|
setup();
|
|
registerCleanupFunction(async () => {
|
|
trr_clear_prefs();
|
|
Services.prefs.clearUserPref("network.proxy.type");
|
|
Services.prefs.clearUserPref("network.proxy.autoconfig_url");
|
|
Services.prefs.clearUserPref("network.trr.async_connInfo");
|
|
if (trrProxy) {
|
|
await trrProxy.stop();
|
|
}
|
|
});
|
|
|
|
class ProxyFilter {
|
|
constructor(type, host, port, flags) {
|
|
this._type = type;
|
|
this._host = host;
|
|
this._port = port;
|
|
this._flags = flags;
|
|
this.QueryInterface = ChromeUtils.generateQI(["nsIProtocolProxyFilter"]);
|
|
}
|
|
applyFilter(uri, pi, cb) {
|
|
if (
|
|
uri.pathQueryRef.startsWith("/execute") ||
|
|
uri.pathQueryRef.startsWith("/fork") ||
|
|
uri.pathQueryRef.startsWith("/kill")
|
|
) {
|
|
// So we allow NodeServer.execute to work
|
|
cb.onProxyFilterResult(pi);
|
|
return;
|
|
}
|
|
cb.onProxyFilterResult(
|
|
pps.newProxyInfo(
|
|
this._type,
|
|
this._host,
|
|
this._port,
|
|
"",
|
|
"",
|
|
this._flags,
|
|
1000,
|
|
null
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
async function doTest(proxySetup, delay) {
|
|
info("Verifying a basic A record");
|
|
dns.clearCache(true);
|
|
setModeAndURI(2, "doh?responseIP=2.2.2.2"); // TRR-first
|
|
|
|
trrProxy = new TRRProxy();
|
|
await trrProxy.start(h2Port);
|
|
info("port=" + trrProxy.port);
|
|
|
|
await proxySetup(trrProxy.port);
|
|
|
|
if (delay) {
|
|
await new Promise(resolve => do_timeout(delay, resolve));
|
|
}
|
|
|
|
await new TRRDNSListener("bar.example.com", "2.2.2.2");
|
|
|
|
// Session count is 2 because of we send two TRR queries (A and AAAA).
|
|
Assert.equal(
|
|
await trrProxy.proxy_session_counter(),
|
|
2,
|
|
`Session count should be 2`
|
|
);
|
|
|
|
// clean up
|
|
Services.prefs.clearUserPref("network.proxy.type");
|
|
Services.prefs.clearUserPref("network.proxy.autoconfig_url");
|
|
if (filter) {
|
|
pps.unregisterFilter(filter);
|
|
filter = null;
|
|
}
|
|
if (systemProxySettings) {
|
|
MockRegistrar.unregister(systemProxySettings);
|
|
systemProxySettings = null;
|
|
}
|
|
|
|
await trrProxy.stop();
|
|
trrProxy = null;
|
|
}
|
|
|
|
add_task(async function test_trr_proxy() {
|
|
async function setupPACWithDataURL(proxyPort) {
|
|
var pac = `data:text/plain, function FindProxyForURL(url, host) { return "HTTPS foo.example.com:${proxyPort}";}`;
|
|
Services.prefs.setIntPref("network.proxy.type", 2);
|
|
Services.prefs.setCharPref("network.proxy.autoconfig_url", pac);
|
|
}
|
|
|
|
async function setupPACWithHttpURL(proxyPort) {
|
|
let httpserv = new HttpServer();
|
|
httpserv.registerPathHandler("/", function handler(metadata, response) {
|
|
response.setStatusLine(metadata.httpVersion, 200, "OK");
|
|
let content = `function FindProxyForURL(url, host) { return "HTTPS foo.example.com:${proxyPort}";}`;
|
|
response.setHeader("Content-Length", `${content.length}`);
|
|
response.bodyOutputStream.write(content, content.length);
|
|
});
|
|
httpserv.start(-1);
|
|
Services.prefs.setIntPref("network.proxy.type", 2);
|
|
let pacUri = `http://127.0.0.1:${httpserv.identity.primaryPort}/`;
|
|
Services.prefs.setCharPref("network.proxy.autoconfig_url", pacUri);
|
|
|
|
function consoleMessageObserved() {
|
|
return new Promise(resolve => {
|
|
let listener = {
|
|
QueryInterface: ChromeUtils.generateQI(["nsIConsoleListener"]),
|
|
observe(msg) {
|
|
if (msg == `PAC file installed from ${pacUri}`) {
|
|
Services.console.unregisterListener(listener);
|
|
resolve();
|
|
}
|
|
},
|
|
};
|
|
Services.console.registerListener(listener);
|
|
});
|
|
}
|
|
|
|
await consoleMessageObserved();
|
|
}
|
|
|
|
async function setupProxyFilter(proxyPort) {
|
|
filter = new ProxyFilter("https", "foo.example.com", proxyPort, 0);
|
|
pps.registerFilter(filter, 10);
|
|
}
|
|
|
|
async function setupSystemProxySettings(proxyPort) {
|
|
systemProxySettings = {
|
|
QueryInterface: ChromeUtils.generateQI(["nsISystemProxySettings"]),
|
|
mainThreadOnly: true,
|
|
PACURI: null,
|
|
getProxyForURI: (aSpec, aScheme, aHost, aPort) => {
|
|
return `HTTPS foo.example.com:${proxyPort}`;
|
|
},
|
|
};
|
|
|
|
MockRegistrar.register(
|
|
"@mozilla.org/system-proxy-settings;1",
|
|
systemProxySettings
|
|
);
|
|
|
|
Services.prefs.setIntPref(
|
|
"network.proxy.type",
|
|
Ci.nsIProtocolProxyService.PROXYCONFIG_SYSTEM
|
|
);
|
|
|
|
// simulate that system proxy setting is changed.
|
|
pps.notifyProxyConfigChangedInternal();
|
|
}
|
|
|
|
Services.prefs.setBoolPref("network.trr.async_connInfo", false);
|
|
await doTest(setupPACWithDataURL);
|
|
await doTest(setupPACWithDataURL, 1000);
|
|
await doTest(setupPACWithHttpURL);
|
|
await doTest(setupPACWithHttpURL, 1000);
|
|
await doTest(setupProxyFilter);
|
|
await doTest(setupProxyFilter, 1000);
|
|
await doTest(setupSystemProxySettings);
|
|
await doTest(setupSystemProxySettings, 1000);
|
|
|
|
Services.prefs.setBoolPref("network.trr.async_connInfo", true);
|
|
await doTest(setupPACWithDataURL);
|
|
await doTest(setupPACWithDataURL, 1000);
|
|
await doTest(setupPACWithHttpURL);
|
|
await doTest(setupPACWithHttpURL, 1000);
|
|
await doTest(setupProxyFilter);
|
|
await doTest(setupProxyFilter, 1000);
|
|
await doTest(setupSystemProxySettings);
|
|
await doTest(setupSystemProxySettings, 1000);
|
|
});
|
|
|
|
add_task(async function test_trr_uri_change() {
|
|
Services.prefs.setIntPref("network.proxy.type", 0);
|
|
Services.prefs.setBoolPref("network.trr.async_connInfo", true);
|
|
dns.clearCache(true);
|
|
setModeAndURI(2, "doh?responseIP=2.2.2.2", "127.0.0.1");
|
|
|
|
await new TRRDNSListener("car.example.com", "127.0.0.1");
|
|
|
|
dns.clearCache(true);
|
|
setModeAndURI(2, "doh?responseIP=2.2.2.2");
|
|
await new TRRDNSListener("car.example.net", "2.2.2.2");
|
|
});
|