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