andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 1 | # Proxy Auto Config Using WPAD |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 2 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 3 | Most systems support manually configuring a proxy for web access, but this is |
Quinten Yearsley | 317532d | 2021-10-20 17:10:31 | [diff] [blame] | 4 | cumbersome and kind of technical, so Chrome also supports |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 5 | [WPAD](http://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol) for proxy |
| 6 | configuration (enabled if "automatically detect proxy settings" is enabled on |
| 7 | Windows). |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 8 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 9 | ## Problem |
| 10 | |
| 11 | Currently, WPAD is pretty slow when we're starting up Chrome - we have to query |
| 12 | the local network for WPAD servers using DNS (and maybe NetBIOS), and we wait |
| 13 | all the way until the resolver timeout before we try sending any HTTP requests |
| 14 | if there's no WPAD server. This is a really crappy user experience, since the |
qyearsley | c0dc6f4 | 2016-12-02 22:13:39 | [diff] [blame] | 15 | browser's basically unusable for a couple of seconds after startup if |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 16 | autoconfig is turned on and there's no WPAD server. |
| 17 | |
| 18 | ## Solution |
| 19 | |
Steven Wei | d98e9ca | 2024-09-25 18:20:33 | [diff] [blame] | 20 | There are a couple of simplifying assumptions we make: |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 21 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 22 | * If there is a WPAD server, it is on the same network as us, and hence likely |
| 23 | to respond to lookups far more quickly than a random internet DNS server |
| 24 | would. |
| 25 | * If we get a lookup success for WPAD, there's overwhelmingly likely to be a |
| 26 | live WPAD server. The WPAD script could also be large (!?) whereas the DNS |
| 27 | response is necessarily small. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 28 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 29 | Therefore our proposed solution is that when we're trying to do WPAD resolution, |
| 30 | we fail very fast if the WPAD server doesn't immediately respond to a lookup |
| 31 | (like, 100ms or less). If there's no WPAD server, we'll time the lookup out in |
| 32 | 100ms and get ourselves out of the critical path much faster. We won't time out |
| 33 | lookups for explicitly-configured WPAD servers (i.e., custom PAC script URLs) in |
| 34 | this fashion; those will still use the normal DNS timeout. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 35 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 36 | **This could have bad effects on networks with slow DNS or WPAD servers**, so we |
| 37 | should be careful to allow users to turn this off, and we should keep statistics |
| 38 | as to how often lookups succeed after the timeout. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 39 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 40 | So here's what our WPAD lookup policy looks like **currently** in practice |
| 41 | (assuming WPAD is enabled throughout): |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 42 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 43 | * If there's no WPAD server on the network, we try to do a lookup for WPAD, |
| 44 | time out after two seconds, and disable WPAD. Until this time, no requests |
| 45 | can proceed. |
| 46 | * If there's a WPAD server and our lookup for it answers in under two seconds, |
| 47 | we use that WPAD server (fetch and execute its script) and proceed with |
| 48 | requests. |
| 49 | * If there's a WPAD server and our lookup for it answers after two seconds, we |
| 50 | time out and do not use it (ever) until a network change triggers a WPAD |
| 51 | reconfiguration. |
andybons | 3322f76 | 2015-08-24 21:37:09 | [diff] [blame] | 52 | |
| 53 | Here's what the **proposed** lookup policy looks like in practice: |
| 54 | |
andybons | ad92aa3 | 2015-08-31 02:27:44 | [diff] [blame] | 55 | * If there's no WPAD server on the network, we try to do a lookup for WPAD, |
| 56 | time out after 100ms, and disable WPAD. |
| 57 | * If there's a WPAD server and our lookup for it answers in under 100ms or |
| 58 | it's explicitly configured (via a custom PAC URL), we use that WPAD server. |
| 59 | * If there's a WPAD server and our lookup for it answers after 100ms, we time |
| 60 | out and do not use it until a network change. |