1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_PROXY_RESOLUTION_PROXY_CONFIG_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_PROXY_RESOLUTION_PROXY_CONFIG_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <string> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 11*6777b538SAndroid Build Coastguard Worker #include "net/base/proxy_server.h" 12*6777b538SAndroid Build Coastguard Worker #include "net/proxy_resolution/proxy_bypass_rules.h" 13*6777b538SAndroid Build Coastguard Worker #include "net/proxy_resolution/proxy_list.h" 14*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace base { 17*6777b538SAndroid Build Coastguard Worker class Value; 18*6777b538SAndroid Build Coastguard Worker } 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace net { 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker class ProxyInfo; 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker // ProxyConfig describes a user's proxy settings. 25*6777b538SAndroid Build Coastguard Worker // 26*6777b538SAndroid Build Coastguard Worker // There are two categories of proxy settings: 27*6777b538SAndroid Build Coastguard Worker // (1) Automatic (indicates the methods to obtain a PAC script) 28*6777b538SAndroid Build Coastguard Worker // (2) Manual (simple set of proxy servers per scheme, and bypass patterns) 29*6777b538SAndroid Build Coastguard Worker // 30*6777b538SAndroid Build Coastguard Worker // When both automatic and manual settings are specified, the Automatic ones 31*6777b538SAndroid Build Coastguard Worker // take precedence over the manual ones. 32*6777b538SAndroid Build Coastguard Worker // 33*6777b538SAndroid Build Coastguard Worker // For more details see: 34*6777b538SAndroid Build Coastguard Worker // http://www.chromium.org/developers/design-documents/network-stack/proxy-settings-fallback 35*6777b538SAndroid Build Coastguard Worker class NET_EXPORT ProxyConfig { 36*6777b538SAndroid Build Coastguard Worker public: 37*6777b538SAndroid Build Coastguard Worker // ProxyRules describes the "manual" proxy settings. 38*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT ProxyRules { 39*6777b538SAndroid Build Coastguard Worker enum class Type { 40*6777b538SAndroid Build Coastguard Worker EMPTY, 41*6777b538SAndroid Build Coastguard Worker PROXY_LIST, 42*6777b538SAndroid Build Coastguard Worker PROXY_LIST_PER_SCHEME, 43*6777b538SAndroid Build Coastguard Worker }; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // Note that the default of Type::EMPTY results in direct connections 46*6777b538SAndroid Build Coastguard Worker // being made when using this ProxyConfig. 47*6777b538SAndroid Build Coastguard Worker ProxyRules(); 48*6777b538SAndroid Build Coastguard Worker ProxyRules(const ProxyRules& other); 49*6777b538SAndroid Build Coastguard Worker ~ProxyRules(); 50*6777b538SAndroid Build Coastguard Worker emptyProxyRules51*6777b538SAndroid Build Coastguard Worker bool empty() const { 52*6777b538SAndroid Build Coastguard Worker return type == Type::EMPTY; 53*6777b538SAndroid Build Coastguard Worker } 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // Sets |result| with the proxies to use for |url| based on the current 56*6777b538SAndroid Build Coastguard Worker // rules. 57*6777b538SAndroid Build Coastguard Worker void Apply(const GURL& url, ProxyInfo* result) const; 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker // Parses the rules from a string, indicating which proxies to use. 60*6777b538SAndroid Build Coastguard Worker // 61*6777b538SAndroid Build Coastguard Worker // proxy-uri = [<proxy-scheme>"://"]<proxy-host>[":"<proxy-port>] 62*6777b538SAndroid Build Coastguard Worker // 63*6777b538SAndroid Build Coastguard Worker // proxy-uri-list = <proxy-uri>[","<proxy-uri-list>] 64*6777b538SAndroid Build Coastguard Worker // 65*6777b538SAndroid Build Coastguard Worker // url-scheme = "http" | "https" | "ftp" | "socks" 66*6777b538SAndroid Build Coastguard Worker // 67*6777b538SAndroid Build Coastguard Worker // scheme-proxies = [<url-scheme>"="]<proxy-uri-list> 68*6777b538SAndroid Build Coastguard Worker // 69*6777b538SAndroid Build Coastguard Worker // proxy-rules = scheme-proxies[";"<scheme-proxies>] 70*6777b538SAndroid Build Coastguard Worker // 71*6777b538SAndroid Build Coastguard Worker // Thus, the proxy-rules string should be a semicolon-separated list of 72*6777b538SAndroid Build Coastguard Worker // ordered proxies that apply to a particular URL scheme. Unless specified, 73*6777b538SAndroid Build Coastguard Worker // the proxy scheme for proxy-uris is assumed to be http. 74*6777b538SAndroid Build Coastguard Worker // 75*6777b538SAndroid Build Coastguard Worker // Some special cases: 76*6777b538SAndroid Build Coastguard Worker // * If the scheme is omitted from the first proxy list, that list applies 77*6777b538SAndroid Build Coastguard Worker // to all URL schemes and subsequent lists are ignored. 78*6777b538SAndroid Build Coastguard Worker // * If a scheme is omitted from any proxy list after a list where a scheme 79*6777b538SAndroid Build Coastguard Worker // has been provided, the list without a scheme is ignored. 80*6777b538SAndroid Build Coastguard Worker // * If the url-scheme is set to 'socks', that sets a fallback list that 81*6777b538SAndroid Build Coastguard Worker // to all otherwise unspecified url-schemes, however the default proxy- 82*6777b538SAndroid Build Coastguard Worker // scheme for proxy urls in the 'socks' list is understood to be 83*6777b538SAndroid Build Coastguard Worker // socks4:// if unspecified. 84*6777b538SAndroid Build Coastguard Worker // 85*6777b538SAndroid Build Coastguard Worker // For example: 86*6777b538SAndroid Build Coastguard Worker // "http=foopy:80;ftp=foopy2" -- use HTTP proxy "foopy:80" for http:// 87*6777b538SAndroid Build Coastguard Worker // URLs, and HTTP proxy "foopy2:80" for 88*6777b538SAndroid Build Coastguard Worker // ftp:// URLs. 89*6777b538SAndroid Build Coastguard Worker // "foopy:80" -- use HTTP proxy "foopy:80" for all URLs. 90*6777b538SAndroid Build Coastguard Worker // "foopy:80,bar,direct://" -- use HTTP proxy "foopy:80" for all URLs, 91*6777b538SAndroid Build Coastguard Worker // failing over to "bar" if "foopy:80" is 92*6777b538SAndroid Build Coastguard Worker // unavailable, and after that using no 93*6777b538SAndroid Build Coastguard Worker // proxy. 94*6777b538SAndroid Build Coastguard Worker // "socks4://foopy" -- use SOCKS v4 proxy "foopy:1080" for all 95*6777b538SAndroid Build Coastguard Worker // URLs. 96*6777b538SAndroid Build Coastguard Worker // "http=foop,socks5://bar.com -- use HTTP proxy "foopy" for http URLs, 97*6777b538SAndroid Build Coastguard Worker // and fail over to the SOCKS5 proxy 98*6777b538SAndroid Build Coastguard Worker // "bar.com" if "foop" is unavailable. 99*6777b538SAndroid Build Coastguard Worker // "http=foopy,direct:// -- use HTTP proxy "foopy" for http URLs, 100*6777b538SAndroid Build Coastguard Worker // and use no proxy if "foopy" is 101*6777b538SAndroid Build Coastguard Worker // unavailable. 102*6777b538SAndroid Build Coastguard Worker // "http=foopy;socks=foopy2 -- use HTTP proxy "foopy" for http URLs, 103*6777b538SAndroid Build Coastguard Worker // and use socks4://foopy2 for all other 104*6777b538SAndroid Build Coastguard Worker // URLs. 105*6777b538SAndroid Build Coastguard Worker void ParseFromString(const std::string& proxy_rules); 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker // Returns one of {&proxies_for_http, &proxies_for_https, &proxies_for_ftp, 108*6777b538SAndroid Build Coastguard Worker // &fallback_proxies}, or NULL if there is no proxy to use. 109*6777b538SAndroid Build Coastguard Worker // Should only call this if the type is Type::PROXY_LIST_PER_SCHEME. 110*6777b538SAndroid Build Coastguard Worker const ProxyList* MapUrlSchemeToProxyList( 111*6777b538SAndroid Build Coastguard Worker const std::string& url_scheme) const; 112*6777b538SAndroid Build Coastguard Worker 113*6777b538SAndroid Build Coastguard Worker // Returns true if |*this| describes the same configuration as |other|. 114*6777b538SAndroid Build Coastguard Worker bool Equals(const ProxyRules& other) const; 115*6777b538SAndroid Build Coastguard Worker CreateForTestingProxyRules116*6777b538SAndroid Build Coastguard Worker static ProxyRules CreateForTesting(const ProxyList& proxy_list) { 117*6777b538SAndroid Build Coastguard Worker ProxyRules proxy_rules; 118*6777b538SAndroid Build Coastguard Worker proxy_rules.type = Type::PROXY_LIST; 119*6777b538SAndroid Build Coastguard Worker proxy_rules.single_proxies = proxy_list; 120*6777b538SAndroid Build Coastguard Worker return proxy_rules; 121*6777b538SAndroid Build Coastguard Worker } 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker // Exceptions for when not to use a proxy. 124*6777b538SAndroid Build Coastguard Worker ProxyBypassRules bypass_rules; 125*6777b538SAndroid Build Coastguard Worker 126*6777b538SAndroid Build Coastguard Worker // Reverse the meaning of |bypass_rules|. 127*6777b538SAndroid Build Coastguard Worker bool reverse_bypass = false; 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker Type type = Type::EMPTY; 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker // Set if |type| is Type::PROXY_LIST. 132*6777b538SAndroid Build Coastguard Worker ProxyList single_proxies; 133*6777b538SAndroid Build Coastguard Worker 134*6777b538SAndroid Build Coastguard Worker // Set if |type| is Type::PROXY_LIST_PER_SCHEME. 135*6777b538SAndroid Build Coastguard Worker ProxyList proxies_for_http; 136*6777b538SAndroid Build Coastguard Worker ProxyList proxies_for_https; 137*6777b538SAndroid Build Coastguard Worker ProxyList proxies_for_ftp; 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker // Used when a fallback has been defined and the url to be proxied doesn't 140*6777b538SAndroid Build Coastguard Worker // match any of the standard schemes. 141*6777b538SAndroid Build Coastguard Worker ProxyList fallback_proxies; 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard Worker private: 144*6777b538SAndroid Build Coastguard Worker // Returns one of {&proxies_for_http, &proxies_for_https, &proxies_for_ftp} 145*6777b538SAndroid Build Coastguard Worker // or NULL if it is a scheme that we don't have a mapping for. Should only 146*6777b538SAndroid Build Coastguard Worker // call this if the type is Type::PROXY_LIST_PER_SCHEME. Intentionally returns 147*6777b538SAndroid Build Coastguard Worker // NULL for "ws" and "wss" as those are handled specially by 148*6777b538SAndroid Build Coastguard Worker // GetProxyListForWebSocketScheme(). 149*6777b538SAndroid Build Coastguard Worker ProxyList* MapUrlSchemeToProxyListNoFallback(const std::string& scheme); 150*6777b538SAndroid Build Coastguard Worker 151*6777b538SAndroid Build Coastguard Worker // Returns the first of {&fallback_proxies, &proxies_for_https, 152*6777b538SAndroid Build Coastguard Worker // &proxies_for_http} that is non-empty, or NULL. 153*6777b538SAndroid Build Coastguard Worker const ProxyList* GetProxyListForWebSocketScheme() const; 154*6777b538SAndroid Build Coastguard Worker }; 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker ProxyConfig(); 157*6777b538SAndroid Build Coastguard Worker ProxyConfig(const ProxyConfig& config); 158*6777b538SAndroid Build Coastguard Worker ~ProxyConfig(); 159*6777b538SAndroid Build Coastguard Worker ProxyConfig& operator=(const ProxyConfig& config); 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker // Returns true if the given config is equivalent to this config. 162*6777b538SAndroid Build Coastguard Worker bool Equals(const ProxyConfig& other) const; 163*6777b538SAndroid Build Coastguard Worker 164*6777b538SAndroid Build Coastguard Worker // Returns true if this config contains any "automatic" settings. See the 165*6777b538SAndroid Build Coastguard Worker // class description for what that means. 166*6777b538SAndroid Build Coastguard Worker bool HasAutomaticSettings() const; 167*6777b538SAndroid Build Coastguard Worker 168*6777b538SAndroid Build Coastguard Worker void ClearAutomaticSettings(); 169*6777b538SAndroid Build Coastguard Worker 170*6777b538SAndroid Build Coastguard Worker // Creates a Value dump of this configuration. 171*6777b538SAndroid Build Coastguard Worker base::Value ToValue() const; 172*6777b538SAndroid Build Coastguard Worker proxy_rules()173*6777b538SAndroid Build Coastguard Worker ProxyRules& proxy_rules() { 174*6777b538SAndroid Build Coastguard Worker return proxy_rules_; 175*6777b538SAndroid Build Coastguard Worker } 176*6777b538SAndroid Build Coastguard Worker proxy_rules()177*6777b538SAndroid Build Coastguard Worker const ProxyRules& proxy_rules() const { 178*6777b538SAndroid Build Coastguard Worker return proxy_rules_; 179*6777b538SAndroid Build Coastguard Worker } 180*6777b538SAndroid Build Coastguard Worker set_pac_url(const GURL & url)181*6777b538SAndroid Build Coastguard Worker void set_pac_url(const GURL& url) { 182*6777b538SAndroid Build Coastguard Worker pac_url_ = url; 183*6777b538SAndroid Build Coastguard Worker } 184*6777b538SAndroid Build Coastguard Worker pac_url()185*6777b538SAndroid Build Coastguard Worker const GURL& pac_url() const { 186*6777b538SAndroid Build Coastguard Worker return pac_url_; 187*6777b538SAndroid Build Coastguard Worker } 188*6777b538SAndroid Build Coastguard Worker set_pac_mandatory(bool enable_pac_mandatory)189*6777b538SAndroid Build Coastguard Worker void set_pac_mandatory(bool enable_pac_mandatory) { 190*6777b538SAndroid Build Coastguard Worker pac_mandatory_ = enable_pac_mandatory; 191*6777b538SAndroid Build Coastguard Worker } 192*6777b538SAndroid Build Coastguard Worker pac_mandatory()193*6777b538SAndroid Build Coastguard Worker bool pac_mandatory() const { 194*6777b538SAndroid Build Coastguard Worker return pac_mandatory_; 195*6777b538SAndroid Build Coastguard Worker } 196*6777b538SAndroid Build Coastguard Worker has_pac_url()197*6777b538SAndroid Build Coastguard Worker bool has_pac_url() const { 198*6777b538SAndroid Build Coastguard Worker return pac_url_.is_valid(); 199*6777b538SAndroid Build Coastguard Worker } 200*6777b538SAndroid Build Coastguard Worker set_auto_detect(bool enable_auto_detect)201*6777b538SAndroid Build Coastguard Worker void set_auto_detect(bool enable_auto_detect) { 202*6777b538SAndroid Build Coastguard Worker auto_detect_ = enable_auto_detect; 203*6777b538SAndroid Build Coastguard Worker } 204*6777b538SAndroid Build Coastguard Worker auto_detect()205*6777b538SAndroid Build Coastguard Worker bool auto_detect() const { 206*6777b538SAndroid Build Coastguard Worker return auto_detect_; 207*6777b538SAndroid Build Coastguard Worker } 208*6777b538SAndroid Build Coastguard Worker set_from_system(bool from_system)209*6777b538SAndroid Build Coastguard Worker void set_from_system(bool from_system) { from_system_ = from_system; } 210*6777b538SAndroid Build Coastguard Worker from_system()211*6777b538SAndroid Build Coastguard Worker bool from_system() const { return from_system_; } 212*6777b538SAndroid Build Coastguard Worker 213*6777b538SAndroid Build Coastguard Worker // Helpers to construct some common proxy configurations. 214*6777b538SAndroid Build Coastguard Worker CreateDirect()215*6777b538SAndroid Build Coastguard Worker static ProxyConfig CreateDirect() { 216*6777b538SAndroid Build Coastguard Worker return ProxyConfig(); 217*6777b538SAndroid Build Coastguard Worker } 218*6777b538SAndroid Build Coastguard Worker CreateAutoDetect()219*6777b538SAndroid Build Coastguard Worker static ProxyConfig CreateAutoDetect() { 220*6777b538SAndroid Build Coastguard Worker ProxyConfig config; 221*6777b538SAndroid Build Coastguard Worker config.set_auto_detect(true); 222*6777b538SAndroid Build Coastguard Worker return config; 223*6777b538SAndroid Build Coastguard Worker } 224*6777b538SAndroid Build Coastguard Worker CreateFromCustomPacURL(const GURL & pac_url)225*6777b538SAndroid Build Coastguard Worker static ProxyConfig CreateFromCustomPacURL(const GURL& pac_url) { 226*6777b538SAndroid Build Coastguard Worker ProxyConfig config; 227*6777b538SAndroid Build Coastguard Worker config.set_pac_url(pac_url); 228*6777b538SAndroid Build Coastguard Worker // By default fall back to direct connection in case PAC script fails. 229*6777b538SAndroid Build Coastguard Worker config.set_pac_mandatory(false); 230*6777b538SAndroid Build Coastguard Worker return config; 231*6777b538SAndroid Build Coastguard Worker } 232*6777b538SAndroid Build Coastguard Worker CreateForTesting(const ProxyList & proxy_list)233*6777b538SAndroid Build Coastguard Worker static ProxyConfig CreateForTesting(const ProxyList& proxy_list) { 234*6777b538SAndroid Build Coastguard Worker ProxyConfig config; 235*6777b538SAndroid Build Coastguard Worker config.proxy_rules_ = ProxyRules::CreateForTesting(proxy_list); 236*6777b538SAndroid Build Coastguard Worker return config; 237*6777b538SAndroid Build Coastguard Worker } 238*6777b538SAndroid Build Coastguard Worker 239*6777b538SAndroid Build Coastguard Worker private: 240*6777b538SAndroid Build Coastguard Worker // True if the proxy configuration should be auto-detected. 241*6777b538SAndroid Build Coastguard Worker bool auto_detect_ = false; 242*6777b538SAndroid Build Coastguard Worker 243*6777b538SAndroid Build Coastguard Worker // True if the proxy configuration was created from system settings. 244*6777b538SAndroid Build Coastguard Worker bool from_system_ = false; 245*6777b538SAndroid Build Coastguard Worker 246*6777b538SAndroid Build Coastguard Worker // If non-empty, indicates the URL of the proxy auto-config file to use. 247*6777b538SAndroid Build Coastguard Worker GURL pac_url_; 248*6777b538SAndroid Build Coastguard Worker 249*6777b538SAndroid Build Coastguard Worker // If true, blocks all traffic in case fetching the PAC script from |pac_url_| 250*6777b538SAndroid Build Coastguard Worker // fails. Only valid if |pac_url_| is non-empty. 251*6777b538SAndroid Build Coastguard Worker bool pac_mandatory_ = false; 252*6777b538SAndroid Build Coastguard Worker 253*6777b538SAndroid Build Coastguard Worker // Manual proxy settings. 254*6777b538SAndroid Build Coastguard Worker ProxyRules proxy_rules_; 255*6777b538SAndroid Build Coastguard Worker }; 256*6777b538SAndroid Build Coastguard Worker 257*6777b538SAndroid Build Coastguard Worker } // namespace net 258*6777b538SAndroid Build Coastguard Worker 259*6777b538SAndroid Build Coastguard Worker 260*6777b538SAndroid Build Coastguard Worker 261*6777b538SAndroid Build Coastguard Worker #endif // NET_PROXY_RESOLUTION_PROXY_CONFIG_H_ 262