Bug 1373646 add nsIProxyInfo to webrequest, r?kmag
MozReview-Commit-ID: pc98rgtkVc
--- a/toolkit/components/extensions/ext-webRequest.js
+++ b/toolkit/components/extensions/ext-webRequest.js
@@ -64,17 +64,17 @@ function WebRequestEventManager(context,
data2.fromCache = !!data.fromCache;
}
if ("ip" in data) {
data2.ip = data.ip;
}
let optional = ["requestHeaders", "responseHeaders", "statusCode", "statusLine", "error", "redirectUrl",
- "requestBody", "scheme", "realm", "isProxy", "challenger"];
+ "requestBody", "scheme", "realm", "isProxy", "challenger", "proxyInfo"];
for (let opt of optional) {
if (opt in data) {
data2[opt] = data[opt];
}
}
return fire.sync(data2);
};
--- a/toolkit/components/extensions/test/xpcshell/test_ext_proxy_auth.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_proxy_auth.js
@@ -12,48 +12,66 @@ proxy.registerPathHandler("/", (request,
} else {
response.setStatusLine(request.httpVersion, 407, "Proxy authentication required");
response.setHeader("Proxy-Authenticate", 'Basic realm="foobar"', false);
response.write("ok");
}
});
add_task(async function test_webRequest_auth_proxy() {
- async function background() {
- browser.webRequest.onAuthRequired.addListener((details) => {
+ async function background(port) {
+ browser.webRequest.onBeforeRequest.addListener(details => {
+ browser.test.log(`details ${JSON.stringify(details)}\n`);
+ browser.test.assertEq("localhost", details.proxyInfo.host, "proxy host");
+ browser.test.assertEq(port, details.proxyInfo.port, "proxy port");
+ browser.test.assertEq("http", details.proxyInfo.type, "proxy type");
+ browser.test.assertEq("", details.proxyInfo.username, "proxy username not set");
+ }, {urls: ["<all_urls>"]});
+ browser.webRequest.onAuthRequired.addListener(details => {
browser.test.assertTrue(details.isProxy, "proxied request");
- browser.test.sendMessage("done", details.challenger);
+ browser.test.assertEq("localhost", details.proxyInfo.host, "proxy host");
+ browser.test.assertEq(port, details.proxyInfo.port, "proxy port");
+ browser.test.assertEq("http", details.proxyInfo.type, "proxy type");
+ browser.test.assertEq("localhost", details.challenger.host, "proxy host");
+ browser.test.assertEq(port, details.challenger.port, "proxy port");
return {authCredentials: {username: "puser", password: "ppass"}};
}, {urls: ["<all_urls>"]}, ["blocking"]);
+ browser.webRequest.onCompleted.addListener(details => {
+ browser.test.log(`details ${JSON.stringify(details)}\n`);
+ browser.test.assertEq("localhost", details.proxyInfo.host, "proxy host");
+ browser.test.assertEq(port, details.proxyInfo.port, "proxy port");
+ browser.test.assertEq("http", details.proxyInfo.type, "proxy type");
+ browser.test.assertEq("", details.proxyInfo.username, "proxy username not set by onAuthRequired");
+ browser.test.assertEq(undefined, details.proxyInfo.password, "no proxy password");
+ browser.test.sendMessage("done");
+ }, {urls: ["<all_urls>"]});
await browser.proxy.register("proxy.js");
browser.test.sendMessage("pac-ready");
}
let handlingExt = ExtensionTestUtils.loadExtension({
manifest: {
permissions: [
"proxy",
"webRequest",
"webRequestBlocking",
"<all_urls>",
],
},
- background,
+ background: `(${background})(${proxy.identity.primaryPort})`,
files: {
"proxy.js": `
function FindProxyForURL(url, host) {
return "PROXY localhost:${proxy.identity.primaryPort}; DIRECT";
}`,
},
});
await handlingExt.startup();
await handlingExt.awaitMessage("pac-ready");
let contentPage = await ExtensionTestUtils.loadContentPage(`http://mozilla.org/`);
- let challenger = await handlingExt.awaitMessage("done");
- equal(challenger.host, "localhost", "proxy host");
- equal(challenger.port, proxy.identity.primaryPort, "proxy port");
+ await handlingExt.awaitMessage("done");
await contentPage.close();
await handlingExt.unload();
}).only();
--- a/toolkit/modules/addons/WebRequest.jsm
+++ b/toolkit/modules/addons/WebRequest.jsm
@@ -842,16 +842,28 @@ HttpObserverManager = {
try {
data.ip = channel.remoteAddress;
} catch (e) {
// The remoteAddress getter throws if the address is unavailable,
// but ip is an optional property so just ignore the exception.
}
}
+ if (channel instanceof Ci.nsIProxiedChannel && channel.proxyInfo) {
+ let pi = channel.proxyInfo;
+ data.proxyInfo = {
+ host: pi.host,
+ port: pi.port,
+ type: pi.type,
+ username: pi.username,
+ proxyDNS: pi.flags == Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST,
+ failoverTimeout: pi.failoverTimeout,
+ };
+ }
+
return Object.assign(data, extraData);
},
canModify(channel) {
let {isHostPermitted} = AddonManagerPermissions;
// Bug 1334550 introduced the possibility of having a JAR uri here,
// use the result uri if possible in that case.