|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef NET_PROXY_RESOLUTION_PROXY_CONFIG_H_ | 
|  | #define NET_PROXY_RESOLUTION_PROXY_CONFIG_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "net/base/net_export.h" | 
|  | #include "net/base/proxy_server.h" | 
|  | #include "net/proxy_resolution/proxy_bypass_rules.h" | 
|  | #include "net/proxy_resolution/proxy_list.h" | 
|  | #include "url/gurl.h" | 
|  |  | 
|  | namespace base { | 
|  | class Value; | 
|  | class DictionaryValue; | 
|  | } | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | class ProxyInfo; | 
|  |  | 
|  | // ProxyConfig describes a user's proxy settings. | 
|  | // | 
|  | // There are two categories of proxy settings: | 
|  | //   (1) Automatic (indicates the methods to obtain a PAC script) | 
|  | //   (2) Manual (simple set of proxy servers per scheme, and bypass patterns) | 
|  | // | 
|  | // When both automatic and manual settings are specified, the Automatic ones | 
|  | // take precedence over the manual ones. | 
|  | // | 
|  | // For more details see: | 
|  | // http://www.chromium.org/developers/design-documents/proxy-settings-fallback | 
|  | class NET_EXPORT ProxyConfig { | 
|  | public: | 
|  | // ProxyRules describes the "manual" proxy settings. | 
|  | struct NET_EXPORT ProxyRules { | 
|  | enum class Type { | 
|  | EMPTY, | 
|  | PROXY_LIST, | 
|  | PROXY_LIST_PER_SCHEME, | 
|  | }; | 
|  |  | 
|  | // Note that the default of Type::EMPTY results in direct connections | 
|  | // being made when using this ProxyConfig. | 
|  | ProxyRules(); | 
|  | ProxyRules(const ProxyRules& other); | 
|  | ~ProxyRules(); | 
|  |  | 
|  | bool empty() const { | 
|  | return type == Type::EMPTY; | 
|  | } | 
|  |  | 
|  | // Sets |result| with the proxies to use for |url| based on the current | 
|  | // rules. | 
|  | void Apply(const GURL& url, ProxyInfo* result) const; | 
|  |  | 
|  | // Parses the rules from a string, indicating which proxies to use. | 
|  | // | 
|  | //   proxy-uri = [<proxy-scheme>"://"]<proxy-host>[":"<proxy-port>] | 
|  | // | 
|  | //   proxy-uri-list = <proxy-uri>[","<proxy-uri-list>] | 
|  | // | 
|  | //   url-scheme = "http" | "https" | "ftp" | "socks" | 
|  | // | 
|  | //   scheme-proxies = [<url-scheme>"="]<proxy-uri-list> | 
|  | // | 
|  | //   proxy-rules = scheme-proxies[";"<scheme-proxies>] | 
|  | // | 
|  | // Thus, the proxy-rules string should be a semicolon-separated list of | 
|  | // ordered proxies that apply to a particular URL scheme. Unless specified, | 
|  | // the proxy scheme for proxy-uris is assumed to be http. | 
|  | // | 
|  | // Some special cases: | 
|  | //  * If the scheme is omitted from the first proxy list, that list applies | 
|  | //    to all URL schemes and subsequent lists are ignored. | 
|  | //  * If a scheme is omitted from any proxy list after a list where a scheme | 
|  | //    has been provided, the list without a scheme is ignored. | 
|  | //  * If the url-scheme is set to 'socks', that sets a fallback list that | 
|  | //    to all otherwise unspecified url-schemes, however the default proxy- | 
|  | //    scheme for proxy urls in the 'socks' list is understood to be | 
|  | //    socks4:// if unspecified. | 
|  | // | 
|  | // For example: | 
|  | //   "http=foopy:80;ftp=foopy2"  -- use HTTP proxy "foopy:80" for http:// | 
|  | //                                  URLs, and HTTP proxy "foopy2:80" for | 
|  | //                                  ftp:// URLs. | 
|  | //   "foopy:80"                  -- use HTTP proxy "foopy:80" for all URLs. | 
|  | //   "foopy:80,bar,direct://"    -- use HTTP proxy "foopy:80" for all URLs, | 
|  | //                                  failing over to "bar" if "foopy:80" is | 
|  | //                                  unavailable, and after that using no | 
|  | //                                  proxy. | 
|  | //   "socks4://foopy"            -- use SOCKS v4 proxy "foopy:1080" for all | 
|  | //                                  URLs. | 
|  | //   "http=foop,socks5://bar.com -- use HTTP proxy "foopy" for http URLs, | 
|  | //                                  and fail over to the SOCKS5 proxy | 
|  | //                                  "bar.com" if "foop" is unavailable. | 
|  | //   "http=foopy,direct://       -- use HTTP proxy "foopy" for http URLs, | 
|  | //                                  and use no proxy if "foopy" is | 
|  | //                                  unavailable. | 
|  | //   "http=foopy;socks=foopy2   --  use HTTP proxy "foopy" for http URLs, | 
|  | //                                  and use socks4://foopy2 for all other | 
|  | //                                  URLs. | 
|  | void ParseFromString(const std::string& proxy_rules); | 
|  |  | 
|  | // Returns one of {&proxies_for_http, &proxies_for_https, &proxies_for_ftp, | 
|  | // &fallback_proxies}, or NULL if there is no proxy to use. | 
|  | // Should only call this if the type is Type::PROXY_LIST_PER_SCHEME. | 
|  | const ProxyList* MapUrlSchemeToProxyList( | 
|  | const std::string& url_scheme) const; | 
|  |  | 
|  | // Returns true if |*this| describes the same configuration as |other|. | 
|  | bool Equals(const ProxyRules& other) const; | 
|  |  | 
|  | // Exceptions for when not to use a proxy. | 
|  | ProxyBypassRules bypass_rules; | 
|  |  | 
|  | // Reverse the meaning of |bypass_rules|. | 
|  | bool reverse_bypass; | 
|  |  | 
|  | Type type; | 
|  |  | 
|  | // Set if |type| is Type::PROXY_LIST. | 
|  | ProxyList single_proxies; | 
|  |  | 
|  | // Set if |type| is Type::PROXY_LIST_PER_SCHEME. | 
|  | ProxyList proxies_for_http; | 
|  | ProxyList proxies_for_https; | 
|  | ProxyList proxies_for_ftp; | 
|  |  | 
|  | // Used when a fallback has been defined and the url to be proxied doesn't | 
|  | // match any of the standard schemes. | 
|  | ProxyList fallback_proxies; | 
|  |  | 
|  | private: | 
|  | // Returns one of {&proxies_for_http, &proxies_for_https, &proxies_for_ftp} | 
|  | // or NULL if it is a scheme that we don't have a mapping for. Should only | 
|  | // call this if the type is Type::PROXY_LIST_PER_SCHEME. Intentionally returns | 
|  | // NULL for "ws" and "wss" as those are handled specially by | 
|  | // GetProxyListForWebSocketScheme(). | 
|  | ProxyList* MapUrlSchemeToProxyListNoFallback(const std::string& scheme); | 
|  |  | 
|  | // Returns the first of {&fallback_proxies, &proxies_for_https, | 
|  | // &proxies_for_http} that is non-empty, or NULL. | 
|  | const ProxyList* GetProxyListForWebSocketScheme() const; | 
|  | }; | 
|  |  | 
|  | ProxyConfig(); | 
|  | ProxyConfig(const ProxyConfig& config); | 
|  | ~ProxyConfig(); | 
|  | ProxyConfig& operator=(const ProxyConfig& config); | 
|  |  | 
|  | // Returns true if the given config is equivalent to this config.  The | 
|  | // comparison ignores differences in |source()|. | 
|  | bool Equals(const ProxyConfig& other) const; | 
|  |  | 
|  | // Returns true if this config contains any "automatic" settings. See the | 
|  | // class description for what that means. | 
|  | bool HasAutomaticSettings() const; | 
|  |  | 
|  | void ClearAutomaticSettings(); | 
|  |  | 
|  | // Creates a Value dump of this configuration. | 
|  | std::unique_ptr<base::DictionaryValue> ToValue() const; | 
|  |  | 
|  | ProxyRules& proxy_rules() { | 
|  | return proxy_rules_; | 
|  | } | 
|  |  | 
|  | const ProxyRules& proxy_rules() const { | 
|  | return proxy_rules_; | 
|  | } | 
|  |  | 
|  | void set_pac_url(const GURL& url) { | 
|  | pac_url_ = url; | 
|  | } | 
|  |  | 
|  | const GURL& pac_url() const { | 
|  | return pac_url_; | 
|  | } | 
|  |  | 
|  | void set_pac_mandatory(bool enable_pac_mandatory) { | 
|  | pac_mandatory_ = enable_pac_mandatory; | 
|  | } | 
|  |  | 
|  | bool pac_mandatory() const { | 
|  | return pac_mandatory_; | 
|  | } | 
|  |  | 
|  | bool has_pac_url() const { | 
|  | return pac_url_.is_valid(); | 
|  | } | 
|  |  | 
|  | void set_auto_detect(bool enable_auto_detect) { | 
|  | auto_detect_ = enable_auto_detect; | 
|  | } | 
|  |  | 
|  | bool auto_detect() const { | 
|  | return auto_detect_; | 
|  | } | 
|  |  | 
|  | // Helpers to construct some common proxy configurations. | 
|  |  | 
|  | static ProxyConfig CreateDirect() { | 
|  | return ProxyConfig(); | 
|  | } | 
|  |  | 
|  | static ProxyConfig CreateAutoDetect() { | 
|  | ProxyConfig config; | 
|  | config.set_auto_detect(true); | 
|  | return config; | 
|  | } | 
|  |  | 
|  | static ProxyConfig CreateFromCustomPacURL(const GURL& pac_url) { | 
|  | ProxyConfig config; | 
|  | config.set_pac_url(pac_url); | 
|  | // By default fall back to direct connection in case PAC script fails. | 
|  | config.set_pac_mandatory(false); | 
|  | return config; | 
|  | } | 
|  |  | 
|  | private: | 
|  | // True if the proxy configuration should be auto-detected. | 
|  | bool auto_detect_; | 
|  |  | 
|  | // If non-empty, indicates the URL of the proxy auto-config file to use. | 
|  | GURL pac_url_; | 
|  |  | 
|  | // If true, blocks all traffic in case fetching the PAC script from |pac_url_| | 
|  | // fails. Only valid if |pac_url_| is non-empty. | 
|  | bool pac_mandatory_; | 
|  |  | 
|  | // Manual proxy settings. | 
|  | ProxyRules proxy_rules_; | 
|  | }; | 
|  |  | 
|  | }  // namespace net | 
|  |  | 
|  |  | 
|  |  | 
|  | #endif  // NET_PROXY_RESOLUTION_PROXY_CONFIG_H_ |