test_proxy_pac.js (3378B)
1 // These are globlas defined for proxy servers, in ProxyAutoConfig.cpp. See 2 // PACGlobalFunctions 3 /* globals dnsResolve, alert */ 4 5 "use strict"; 6 7 const { TestUtils } = ChromeUtils.importESModule( 8 "resource://testing-common/TestUtils.sys.mjs" 9 ); 10 const override = Cc["@mozilla.org/network/native-dns-override;1"].getService( 11 Ci.nsINativeDNSResolverOverride 12 ); 13 14 class ConsoleListener { 15 messages = []; 16 observe(message) { 17 // Ignore unexpected messages. 18 if (!(message instanceof Ci.nsIConsoleMessage)) { 19 return; 20 } 21 if (!message.message.includes("PAC")) { 22 return; 23 } 24 25 this.messages.push(message.message); 26 } 27 28 register() { 29 Services.console.registerListener(this); 30 } 31 32 unregister() { 33 Services.console.unregisterListener(this); 34 } 35 36 clear() { 37 this.messages = []; 38 } 39 } 40 41 async function configurePac(fn) { 42 let pacURI = `data:application/x-ns-proxy-autoconfig;charset=utf-8,${encodeURIComponent( 43 fn.toString() 44 )}`; 45 Services.prefs.setIntPref("network.proxy.type", 2); 46 Services.prefs.setStringPref("network.proxy.autoconfig_url", pacURI); 47 48 // Do a request so the PAC gets loaded 49 let chan = NetUtil.newChannel({ 50 uri: `http://localhost:1234/`, 51 loadUsingSystemPrincipal: true, 52 }).QueryInterface(Ci.nsIHttpChannel); 53 await new Promise(resolve => 54 chan.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE)) 55 ); 56 57 await TestUtils.waitForCondition( 58 () => 59 !!consoleListener.messages.filter( 60 e => e.includes("PAC file installed from"), 61 0 62 ).length, 63 "Wait for PAC file to be installed." 64 ); 65 consoleListener.clear(); 66 } 67 68 let consoleListener = null; 69 function setup() { 70 Services.prefs.setIntPref("network.proxy.type", 2); 71 Services.prefs.setStringPref("network.proxy.autoconfig_url", ""); 72 consoleListener = new ConsoleListener(); 73 consoleListener.register(); 74 75 registerCleanupFunction(() => { 76 Services.prefs.clearUserPref("network.proxy.type"); 77 Services.prefs.clearUserPref("network.proxy.autoconfig_url"); 78 if (consoleListener) { 79 consoleListener.unregister(); 80 consoleListener = null; 81 } 82 }); 83 } 84 setup(); 85 86 // This method checks that calling dnsResult(null) does not result in 87 // resolving the DNS name "null" 88 add_task(async function test_bug1724345() { 89 consoleListener.clear(); 90 // isInNet is defined by ascii_pac_utils.js which is included for proxies. 91 /* globals isInNet */ 92 let pac = function FindProxyForURL(url, host) { 93 alert(`PAC resolving: ${host}`); 94 let destIP = dnsResolve(host); 95 alert(`PAC result: ${destIP}`); 96 alert( 97 `PAC isInNet: ${host} ${destIP} ${isInNet( 98 destIP, 99 "127.0.0.0", 100 "255.0.0.0" 101 )}` 102 ); 103 return "DIRECT"; 104 }; 105 106 await configurePac(pac); 107 108 override.clearOverrides(); 109 override.addIPOverride("example.org", "N/A"); 110 override.addIPOverride("null", "127.0.0.1"); 111 Services.dns.clearCache(true); 112 113 let chan = NetUtil.newChannel({ 114 uri: `http://example.org:1234/`, 115 loadUsingSystemPrincipal: true, 116 }).QueryInterface(Ci.nsIHttpChannel); 117 await new Promise(resolve => 118 chan.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE)) 119 ); 120 ok( 121 !!consoleListener.messages.filter(e => 122 e.includes("PAC isInNet: example.org null false") 123 ).length, 124 `should have proper result ${consoleListener.messages}` 125 ); 126 });