Bug 1359417 WebExtensions ProxyAPI uses HTTPS proxy instead of HTTP proxy and Bug 1362798 WebExtensions ProxyAPI should support return strings HTTP and SOCKS4 r?mixedpuppy draft
authorAndy McKay <amckay@mozilla.com>
Fri, 26 May 2017 09:36:14 -0700
changeset 585177 52f7757e5653cfbff3c57069c795ec14fdf0ffbf
parent 581334 c800b6dfca673f8cb0f3cf41e4f495755d04bbb3
child 630656 5b76ae4766b6b7a31730db6df5bf02b7fe0f253a
push id61037
push userbmo:amckay@mozilla.com
push dateFri, 26 May 2017 16:38:00 +0000
reviewersmixedpuppy
bugs1359417, 1362798
milestone55.0a1
Bug 1359417 WebExtensions ProxyAPI uses HTTPS proxy instead of HTTP proxy and Bug 1362798 WebExtensions ProxyAPI should support return strings HTTP and SOCKS4 r?mixedpuppy MozReview-Commit-ID: GSxv0s8RPbo
toolkit/components/extensions/ProxyScriptContext.jsm
toolkit/components/extensions/test/xpcshell/test_proxy_scripts.js
--- a/toolkit/components/extensions/ProxyScriptContext.jsm
+++ b/toolkit/components/extensions/ProxyScriptContext.jsm
@@ -38,17 +38,19 @@ const {
   LocalAPIImplementation,
   SchemaAPIManager,
 } = ExtensionCommon;
 
 const PROXY_TYPES = Object.freeze({
   DIRECT: "direct",
   HTTPS: "https",
   PROXY: "proxy",
-  SOCKS: "socks",
+  HTTP: "http", // Synonym for PROXY_TYPES.PROXY
+  SOCKS: "socks",  // SOCKS5
+  SOCKS4: "socks4",
 });
 
 class ProxyScriptContext extends BaseContext {
   constructor(extension, url, contextInfo = {}) {
     super("proxy_script", extension);
     this.contextInfo = contextInfo;
     this.extension = extension;
     this.messageManager = Services.cpmm;
@@ -170,35 +172,39 @@ class ProxyScriptContext extends BaseCon
       });
       return null;
     }
 
     parts[0] = parts[0].toLowerCase();
 
     switch (parts[0]) {
       case PROXY_TYPES.PROXY:
+      case PROXY_TYPES.HTTP:
+      case PROXY_TYPES.HTTPS:
       case PROXY_TYPES.SOCKS:
+      case PROXY_TYPES.SOCKS4:
         if (!parts[1]) {
           this.extension.emit("proxy-error", {
             message: `FindProxyForURL: Missing argument for "${parts[0]}"`,
           });
           return null;
         }
 
         let [host, port] = parts[1].split(":");
         if (!host || !port) {
           this.extension.emit("proxy-error", {
             message: `FindProxyForURL: Unable to parse argument for ${rule}`,
           });
           return null;
         }
 
-        let type = PROXY_TYPES.SOCKS;
+        let type = parts[0];
         if (parts[0] == PROXY_TYPES.PROXY) {
-          type = PROXY_TYPES.HTTPS;
+          // PROXY_TYPES.HTTP and PROXY_TYPES.PROXY are synonyms
+          type = PROXY_TYPES.HTTP;
         }
 
         let failoverProxy = this.createProxyInfo(rules.slice(1));
         return ProxyService.newProxyInfo(type, host, port, 0,
           PROXY_TIMEOUT_SEC, failoverProxy);
       case PROXY_TYPES.DIRECT:
         return null;
       default:
--- a/toolkit/components/extensions/test/xpcshell/test_proxy_scripts.js
+++ b/toolkit/components/extensions/test/xpcshell/test_proxy_scripts.js
@@ -155,16 +155,50 @@ add_task(async function testProxyScriptW
     proxyInfo: null,
   });
 });
 
 add_task(async function testSocksReturnType() {
   await testProxyScript({
     scriptData() {
       function FindProxyForURL(url, host) {
+        return "SOCKS foo.bar:1080";
+      }
+    },
+  }, {
+    proxyInfo: {
+      host: "foo.bar",
+      port: "1080",
+      type: "socks",
+      failoverProxy: null,
+    },
+  });
+});
+
+add_task(async function testSocks4ReturnType() {
+  await testProxyScript({
+    scriptData() {
+      function FindProxyForURL(url, host) {
+        return "SOCKS4 1.2.3.4:1080";
+      }
+    },
+  }, {
+    proxyInfo: {
+      host: "1.2.3.4",
+      port: "1080",
+      type: "socks4",
+      failoverProxy: null,
+    },
+  });
+});
+
+add_task(async function testSocksReturnTypeWithHostCheck() {
+  await testProxyScript({
+    scriptData() {
+      function FindProxyForURL(url, host) {
         if (host === "www.mozilla.org") {
           return "SOCKS 4.4.4.4:9002";
         }
       }
     },
   }, {
     proxyInfo: {
       host: "4.4.4.4",
@@ -181,68 +215,68 @@ add_task(async function testProxyReturnT
       function FindProxyForURL(url, host) {
         return "PROXY 1.2.3.4:8080";
       }
     },
   }, {
     proxyInfo: {
       host: "1.2.3.4",
       port: "8080",
-      type: "https",
+      type: "http",
       failoverProxy: null,
     },
   });
 });
 
 add_task(async function testUnusualWhitespaceForFindProxyForURL() {
   await testProxyScript({
     scriptData() {
       function FindProxyForURL(url, host) {
         return "   PROXY    1.2.3.4:8080      ";
       }
     },
   }, {
     proxyInfo: {
       host: "1.2.3.4",
       port: "8080",
-      type: "https",
+      type: "http",
       failoverProxy: null,
     },
   });
 });
 
 add_task(async function testInvalidProxyScriptIgnoresFailover() {
   await testProxyScript({
     scriptData() {
       function FindProxyForURL(url, host) {
         return "PROXY 1.2.3.4:8080; UNEXPECTED; SOCKS 1.2.3.4:8080";
       }
     },
   }, {
     proxyInfo: {
       host: "1.2.3.4",
       port: "8080",
-      type: "https",
+      type: "http",
       failoverProxy: null,
     },
   });
 });
 
 add_task(async function testProxyScriptWithValidFailovers() {
   await testProxyScript({
     scriptData() {
       function FindProxyForURL(url, host) {
         return "PROXY 1.2.3.4:8080; SOCKS 4.4.4.4:9000; DIRECT";
       }
     },
   }, {
     proxyInfo: {
       host: "1.2.3.4",
       port: "8080",
-      type: "https",
+      type: "http",
       failoverProxy: {
         host: "4.4.4.4",
         port: "9000",
         type: "socks",
         failoverProxy: null,
       },
     },
   });
@@ -254,17 +288,17 @@ add_task(async function testProxyScriptW
       function FindProxyForURL(url, host) {
         return "PROXY 1.2.3.4:8080; INVALID 1.2.3.4:9090; SOCKS 4.4.4.4:9000; DIRECT";
       }
     },
   }, {
     proxyInfo: {
       host: "1.2.3.4",
       port: "8080",
-      type: "https",
+      type: "http",
       failoverProxy: null,
     },
   });
 });
 
 add_task(async function testProxyScriptWithEmptyFailovers() {
   await testProxyScript({
     scriptData() {
@@ -309,13 +343,13 @@ add_task(async function testProxyScriptW
     },
     runtimeMessage: {
       host: "www.mozilla.org",
     },
   }, {
     proxyInfo: {
       host: "1.2.3.4",
       port: "8080",
-      type: "https",
+      type: "http",
       failoverProxy: null,
     },
   });
 });