• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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