Home | History | Annotate | Download | only in static
      1 <div id="pageData-name" class="pageData">Proxy Settings</div>
      2 
      3 <!-- BEGIN AUTHORED CONTENT -->
      4 <p id="classSummary">
      5 Use the <code>chrome.experimental.proxysettings</code> module to manage Chrome's
      6 proxy settings. This module is still experimental. For information on how to use
      7 experimental APIs, see the <a href="experimental.html">chrome.experimental.*
      8   APIs</a> page.
      9 </p>
     10 
     11 <h2 id="manifest">Manifest</h2>
     12 <p>You must declare the "proxy" permission
     13 in the <a href="manifest.html">extension manifest</a>
     14 to use the proxy settings API.
     15 For example:</p>
     16 <pre>{
     17   "name": "My extension",
     18   ...
     19   <b>"permissions": [
     20     "experimental", "proxy"
     21   ]</b>,
     22   ...
     23 }</pre>
     24 
     25 <h2 id="description">Objects and properties</h2>
     26 
     27 <p>
     28 Proxy settings are defined in a 
     29 <a href="#type-ProxyConfig"><code>ProxyConfig</code></a> object. Depending on
     30 Chrome's proxy settings, the settings may contain
     31 <a href="#type-ProxyRules"><code>ProxyRules</code></a> or a <a
     32   href="#type-PacScript"><code>PacScript</code></a>.
     33 </p>
     34 
     35 <h3 id="proxy_modes">Proxy modes</h3>
     36 
     37 <p>
     38 A ProxyConfig object's <code>mode</code> attribute determines the overall
     39 behavior of Chrome with regards to proxy usage. It can take the following
     40 values:
     41 <dl>
     42   <dt><code>direct</code></dt>
     43   <dd>In <code>direct</code> mode all connections are created directly, without
     44   any proxy involved. This mode allows no further parameters in the
     45   <code>ProxyConfig</code> object.</dd>
     46 
     47   <dt><code>auto_detect</code></dt>
     48   <dd>In <code>auto_detect</code> mode the proxy configuration is determined by
     49   a PAC script that can be downloaded at
     50   <a href="http://wpad/wpad.dat">http://wpad/wpad.dat</a>.
     51   This mode allows no further parameters in the <code>ProxyConfig</code>
     52   object.</dd>
     53 
     54   <dt><code>pac_script</code></dt>
     55   <dd>In <code>pac_script</code> mode the proxy configuration is determined by
     56   a PAC script that is either retrieved from the URL specified in the
     57   <a href="#type-PacScript"><code>PacScript</code></a> object or
     58   taken literally from the <code>data</code> element specified in the
     59   <a href="#type-PacScript"><code>PacScript</code></a> object.
     60   Besides this, this mode allows no further parameters in the
     61   <code>ProxyConfig</code> object.</dd>
     62 
     63   <dt><code>fixed_servers</code></dt>
     64   <dd>In <code>fixed_servers</code> mode the proxy configuration is codified in
     65   a <a href="#type-ProxyRules><code>ProxyRules"><code>ProxyRules</code></a>
     66   object. Its structure is described in <a href="#proxy_rules">Proxy rules</a>.
     67   Besides this, the <code>fixed_servers</code> mode allows no further parameters
     68   in the <code>ProxyConfig</code> object.</dd>
     69 
     70   <dt><code>system</code></dt>
     71   <dd>In <code>system</code> mode the proxy configuration is taken from the
     72   operating system. This mode allows no further parameters in the
     73   <code>ProxyConfig</code> object. Note that the <code>system</code> mode is
     74   different from setting no proxy configuration. In the latter case, Chrome
     75   falls back to the system settings only if no command-line options influence
     76   the proxy configuration.</dd>
     77 </dl>
     78 </p>
     79 
     80 <h3 id="proxy_rules">Proxy rules</h3>
     81 
     82 <p>
     83 The <a href="#type-ProxyRules"><code>ProxyRules</code></a> object can contain
     84 either a <code>singleProxy</code> attribute or a subset of
     85 <code>proxyForHttp</code>, <code>proxyForHttps</code>, <code>proxyForFtp</code>,
     86 and <code>fallbackProxy</code>.
     87 </p>
     88 
     89 <p>
     90 In the first case, HTTP, HTTPS and FTP traffic is proxied through the specified
     91 proxy server. Other traffic is sent directly. In the latter case the behavior is
     92 slightly more subtle: If a proxy server is configured for the HTTP, HTTPS or FTP
     93 protocol, the respective traffic is proxied through the specified server. If no
     94 such proxy server is specified or traffic uses a different protocol than HTTP,
     95 HTTPS or FTP, the <code>fallbackProxy</code> is used. If no
     96 <code>fallbackProxy</code> is specified, traffic is sent directly without a
     97 proxy server.
     98 </p>
     99 
    100 <h3 id="proxy_server_objects">Proxy server objects</h3>
    101 
    102 <p>
    103 A proxy server is configured in a
    104 <a href="#type-ProxyServer"><code>ProxyServer</code></a> object. The connection
    105 to the proxy server (defined by the <code>host</code> attribute) uses the
    106 protocol defined in the <code>scheme</code> attribute. If no <code>scheme</code>
    107 is specified, the proxy connection defaults to <code>http</code>.
    108 </p>
    109 
    110 <p>
    111 If no <code>port</code> is defined in a
    112 <a href="#type-ProxyServer"><code>ProxyServer</code></a> object, the port is
    113 derived from the scheme. The default ports are:
    114 <table>
    115   <tr><th>Scheme</th><th>Port</th></tr>
    116   <tr><td>http</td><td>80</td></tr>
    117   <tr><td>https</td><td>443</td></tr>
    118   <tr><td>socks4</td><td>1080</td></tr>
    119   <tr><td>socks5</td><td>1080</td></tr>
    120 </table>
    121 </p>
    122 
    123 <h3 id="bypass_list">Bypass list</h3>
    124 
    125 <p>
    126 Individual servers may be excluded from being proxied with the
    127 <code>bypassList</code>. This list may contain the following entries:
    128 <dl>
    129   <dt><code>[<em>&lt;scheme&gt;</em>://]<em>&lt;host-pattern&gt;</em>[:<em>&lt;port&gt;</em>]</code></dt>
    130   <dd>Match all hostnames that match the pattern <em>&lt;host-pattern&gt;</em>.<br>
    131   Examples: <code>"foobar.com", "*foobar.com", "*.foobar.com", "*foobar.com:99",
    132     "https://x.*.y.com:99"</code></dd>
    133 
    134   <dt><code>[<em>&lt;scheme&gt;</em>://]<em>&lt;ip-literal&gt;</em>[:<em>&lt;port&gt;</em>]</code></dt>
    135   <dd>Match URLs that are IP address literals.<br>
    136   Conceptually this is the similar to the first case, but with special cases
    137   to handle IP literal canonicalization. For example, matching
    138   on "[0:0:0::1]" is the same as matching on "[::1]" because
    139   the IPv6 canonicalization is done internally.<br>
    140   Examples: <code>"127.0.1", "[0:0::1]", "[::1]", "http://[::1]:99"</code></dd>
    141 
    142   <dt><code><em>&lt;ip-literal&gt;</em>/<em>&lt;prefix-length-in-bits&gt;</em></code></dt>
    143   <dd>Match any URL containing an IP literal within the given range. The IP 
    144   range is specified using CIDR notation.<br>
    145   Examples: <code>"192.168.1.1/16", "fefe:13::abc/33"</code></dd>
    146 
    147   <dt><code>&lt;local&gt;</code></dt>
    148   <dd>Match local addresses. An address is local if the host is "127.0.0.1",
    149   "::1", or "localhost".<br>
    150   Example: <code>"&lt;local&gt;"</code></dd>
    151 </dl>
    152 
    153 
    154 <h2 id="precedence">Precedence</h2>
    155 
    156 <p>
    157 Chrome manages settings on different layers. The following list describes the
    158 layers that may influence the effective proxy settings, in increasing order of
    159 precedence.
    160 <ol>
    161   <li>System settings provided by the operating system</li>
    162   <li>Command line parameters</li>
    163   <li>Preferences set by extensions</li>
    164   <li>Policies</li>
    165 </ol>
    166 </p>
    167 
    168 <p>
    169 As the list implies, policies might overrule any changes that you specify with
    170 the proxy settings API.
    171 </p>
    172 
    173 <p>
    174 Chrome allows using different proxy settings for regular windows and incognito
    175 windows. The following example illustrates the behavior. Assume that no policy
    176 overrides the proxy settings and that an extension can set proxy settings for
    177 regular windows <b>(R)</b> and proxy settings for incognito windows <b>(I)</b>.
    178 </p>
    179 
    180 <p>
    181 <ul>
    182   <li>If only <b>(R)</b> is set, these settings are effective for both regular
    183   and incognito windows.</li>
    184   <li>If only <b>(I)</b> is set, these settings are effective for only incognito
    185   windows. Regular windows use the proxy settings determined by the lower layers
    186   (command-line options and system settings).</li>
    187   <li>If both <b>(R)</b> and <b>(I)</b> are set, the respective settings are
    188   used for regular and incognito windows.</li>
    189 </ul>
    190 </p>
    191 
    192 <p>
    193 If two extensions want to set proxy settings, the extension installed last takes
    194 precedence over the other extensions. If the extension installed last sets only
    195 <b>(I)</b>, the settings of regular windows can be defined by more recently
    196 installed extensions.
    197 </p>
    198 
    199 
    200 
    201 <h2 id="overview-examples">Examples</h2>
    202 
    203 <p>
    204 The following code sets a SOCKS 5 proxy for HTTP connections to all servers but
    205 foobar.com and uses direct connections for all other protocols. The settings
    206 apply to regular and incognito windows.
    207 </p>
    208 
    209 <pre>
    210 var config = {
    211   mode: "fixed_servers",
    212   rules: {
    213     httpProxy: {
    214       scheme: "socks5",
    215       host: "1.2.3.4"
    216     },
    217     bypassList: ["foobar.com"]
    218   }
    219 };
    220 chrome.experimental.proxy.settings.set(
    221     {'value': config, 'incognito': false},
    222     function() {});
    223 </pre>
    224 
    225 <p>
    226 The following code sets a custom pac script.
    227 </p>
    228 
    229 <pre>
    230 var config = {
    231   mode: "pac_script",
    232   pacScript: {
    233     data: "function FindProxyForURL(url, host) {\n" +
    234           "  if (host == 'foobar.com')\n" +
    235           "    return 'PROXY blackhole:80';\n" +
    236           "  return 'DIRECT';\n" +
    237           "}"
    238   }
    239 };
    240 chrome.experimental.proxy.settings.set(
    241     {'value': config, 'incognito': false},
    242     function() {});
    243 </pre>
    244 
    245 <p>
    246 The next snippet queries the current proxy settings.
    247 </p>
    248 
    249 <pre>
    250 chrome.experimental.proxy.settings.get(
    251     {'incognito': false},
    252     function(config) {console.log(JSON.stringify(config));});
    253 </pre>
    254 
    255 <p>
    256 Note that the <code>value</code> object passed to <code>set()</code> is not
    257 identical to the <code>value</code> object passed to callback function of
    258 <code>get()</code>. The latter will contain a <code>rules.httpProxy.port</code>
    259 element.
    260 </p>
    261 
    262 <!-- END AUTHORED CONTENT -->
    263