15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_PROXY_PROXY_CONFIG_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_PROXY_PROXY_CONFIG_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_bypass_rules.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_source.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_list.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_server.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyInfo;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ProxyConfig describes a user's proxy settings.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are two categories of proxy settings:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   (1) Automatic (indicates the methods to obtain a PAC script)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   (2) Manual (simple set of proxy servers per scheme, and bypass patterns)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When both automatic and manual settings are specified, the Automatic ones
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// take precedence over the manual ones.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For more details see:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://www.chromium.org/developers/design-documents/proxy-settings-fallback
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT ProxyConfig {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ProxyRules describes the "manual" proxy settings.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(eroman): Turn this into a class.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(marq): Update the enum names; "TYPE_SINGLE_PROXY" really means
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //             the same set of proxies are used for all requests.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct NET_EXPORT ProxyRules {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum Type {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TYPE_NO_RULES,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TYPE_SINGLE_PROXY,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TYPE_PROXY_PER_SCHEME,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note that the default of TYPE_NO_RULES results in direct connections
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // being made when using this ProxyConfig.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyRules();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~ProxyRules();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool empty() const {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return type == TYPE_NO_RULES;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Sets |result| with the proxies to use for |url| based on the current
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // rules.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Apply(const GURL& url, ProxyInfo* result) const;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Parses the rules from a string, indicating which proxies to use.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   proxy-uri = [<proxy-scheme>"://"]<proxy-host>[":"<proxy-port>]
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //   proxy-uri-list = <proxy-uri>[","<proxy-uri-list>]
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //   url-scheme = "http" | "https" | "ftp" | "socks"
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //   scheme-proxies = [<url-scheme>"="]<proxy-uri-list>
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //   proxy-rules = scheme-proxies[";"<scheme-proxies>]
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Thus, the proxy-rules string should be a semicolon-separated list of
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ordered proxies that apply to a particular URL scheme. Unless specified,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the proxy scheme for proxy-uris is assumed to be http.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Some special cases:
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //  * If the scheme is omitted from the first proxy list, that list applies
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //    to all URL schemes and subsequent lists are ignored.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //  * If a scheme is omitted from any proxy list after a list where a scheme
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //    has been provided, the list without a scheme is ignored.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //  * If the url-scheme is set to 'socks', that sets a fallback list that
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //    to all otherwise unspecified url-schemes, however the default proxy-
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //    scheme for proxy urls in the 'socks' list is understood to be
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //    socks4:// if unspecified.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For example:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   "http=foopy:80;ftp=foopy2"  -- use HTTP proxy "foopy:80" for http://
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //                                  URLs, and HTTP proxy "foopy2:80" for
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //                                  ftp:// URLs.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   "foopy:80"                  -- use HTTP proxy "foopy:80" for all URLs.
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //   "foopy:80,bar,direct://"    -- use HTTP proxy "foopy:80" for all URLs,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //                                  failing over to "bar" if "foopy:80" is
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //                                  unavailable, and after that using no
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //                                  proxy.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   "socks4://foopy"            -- use SOCKS v4 proxy "foopy:1080" for all
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //                                  URLs.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //   "http=foop,socks5://bar.com -- use HTTP proxy "foopy" for http URLs,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //                                  and fail over to the SOCKS5 proxy
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //                                  "bar.com" if "foop" is unavailable.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //   "http=foopy,direct://       -- use HTTP proxy "foopy" for http URLs,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //                                  and use no proxy if "foopy" is
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //                                  unavailable.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //   "http=foopy;socks=foopy2   --  use HTTP proxy "foopy" for http URLs,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //                                  and use socks4://foopy2 for all other
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //                                  URLs.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void ParseFromString(const std::string& proxy_rules);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Returns one of {&proxies_for_http, &proxies_for_https, &proxies_for_ftp,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // &fallback_proxies}, or NULL if there is no proxy to use.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should only call this if the type is TYPE_PROXY_PER_SCHEME.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ProxyList* MapUrlSchemeToProxyList(
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::string& url_scheme) const;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns true if |*this| describes the same configuration as |other|.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool Equals(const ProxyRules& other) const;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Exceptions for when not to use a proxy.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyBypassRules bypass_rules;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reverse the meaning of |bypass_rules|.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool reverse_bypass;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Type type;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set if |type| is TYPE_SINGLE_PROXY.
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProxyList single_proxies;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set if |type| is TYPE_PROXY_PER_SCHEME.
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProxyList proxies_for_http;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProxyList proxies_for_https;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProxyList proxies_for_ftp;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Used when a fallback has been defined and the url to be proxied doesn't
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // match any of the standard schemes.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProxyList fallback_proxies;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Returns one of {&proxies_for_http, &proxies_for_https, &proxies_for_ftp}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // or NULL if it is a scheme that we don't have a mapping
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // for. Should only call this if the type is TYPE_PROXY_PER_SCHEME.
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProxyList* MapUrlSchemeToProxyListNoFallback(const std::string& scheme);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef int ID;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates an invalid proxy config.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const ID kInvalidConfigID = 0;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfig();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfig(const ProxyConfig& config);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ProxyConfig();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfig& operator=(const ProxyConfig& config);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to numerically identify this configuration.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ID id() const { return id_; }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_id(ID id) { id_ = id; }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid() const { return id_ != kInvalidConfigID; }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the given config is equivalent to this config.  The
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // comparison ignores differences in |id()| and |source()|.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Equals(const ProxyConfig& other) const;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if this config contains any "automatic" settings. See the
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class description for what that means.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasAutomaticSettings() const;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearAutomaticSettings();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a Value dump of this configuration. The caller is responsible for
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deleting the returned value.
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::DictionaryValue* ToValue() const;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyRules& proxy_rules() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return proxy_rules_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ProxyRules& proxy_rules() const {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return proxy_rules_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_pac_url(const GURL& url) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pac_url_ = url;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& pac_url() const {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pac_url_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_pac_mandatory(bool enable_pac_mandatory) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pac_mandatory_ = enable_pac_mandatory;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pac_mandatory() const {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pac_mandatory_;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_pac_url() const {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pac_url_.is_valid();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_auto_detect(bool enable_auto_detect) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    auto_detect_ = enable_auto_detect;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool auto_detect() const {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return auto_detect_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_source(ProxyConfigSource source) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    source_ = source;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigSource source() const {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return source_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers to construct some common proxy configurations.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ProxyConfig CreateDirect() {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ProxyConfig();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ProxyConfig CreateAutoDetect() {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyConfig config;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config.set_auto_detect(true);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return config;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ProxyConfig CreateFromCustomPacURL(const GURL& pac_url) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyConfig config;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config.set_pac_url(pac_url);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // By default fall back to direct connection in case PAC script fails.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config.set_pac_mandatory(false);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return config;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the proxy configuration should be auto-detected.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool auto_detect_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If non-empty, indicates the URL of the proxy auto-config file to use.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL pac_url_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If true, blocks all traffic in case fetching the pac script from |pac_url_|
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fails. Only valid if |pac_url_| is non-empty.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pac_mandatory_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Manual proxy settings.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyRules proxy_rules_;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Source of proxy settings.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigSource source_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ID id_;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_PROXY_PROXY_CONFIG_H_
264