OLD | NEW |
| (Empty) |
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 | |
54 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. | |
163 ID id() const { return id_; } | |
164 void set_id(ID id) { id_ = id; } | |
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 | |
181 ProxyRules& proxy_rules() { | |
182 return proxy_rules_; | |
183 } | |
184 | |
185 const ProxyRules& proxy_rules() const { | |
186 return proxy_rules_; | |
187 } | |
188 | |
189 void set_pac_url(const GURL& url) { | |
190 pac_url_ = url; | |
191 } | |
192 | |
193 const GURL& pac_url() const { | |
194 return pac_url_; | |
195 } | |
196 | |
197 void set_pac_mandatory(bool enable_pac_mandatory) { | |
198 pac_mandatory_ = enable_pac_mandatory; | |
199 } | |
200 | |
201 bool pac_mandatory() const { | |
202 return pac_mandatory_; | |
203 } | |
204 | |
205 bool has_pac_url() const { | |
206 return pac_url_.is_valid(); | |
207 } | |
208 | |
209 void set_auto_detect(bool enable_auto_detect) { | |
210 auto_detect_ = enable_auto_detect; | |
211 } | |
212 | |
213 bool auto_detect() const { | |
214 return auto_detect_; | |
215 } | |
216 | |
217 void set_source(ProxyConfigSource source) { | |
218 source_ = source; | |
219 } | |
220 | |
221 ProxyConfigSource source() const { | |
222 return source_; | |
223 } | |
224 | |
225 // Helpers to construct some common proxy configurations. | |
226 | |
227 static ProxyConfig CreateDirect() { | |
228 return ProxyConfig(); | |
229 } | |
230 | |
231 static ProxyConfig CreateAutoDetect() { | |
232 ProxyConfig config; | |
233 config.set_auto_detect(true); | |
234 return config; | |
235 } | |
236 | |
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_ | |
OLD | NEW |