• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 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 #pragma once
8 
9 #include <string>
10 
11 #include "googleurl/src/gurl.h"
12 #include "net/base/net_export.h"
13 #include "net/proxy/proxy_bypass_rules.h"
14 #include "net/proxy/proxy_server.h"
15 
16 class Value;
17 
18 namespace net {
19 
20 class ProxyInfo;
21 
22 // ProxyConfig describes a user's proxy settings.
23 //
24 // There are two categories of proxy settings:
25 //   (1) Automatic (indicates the methods to obtain a PAC script)
26 //   (2) Manual (simple set of proxy servers per scheme, and bypass patterns)
27 //
28 // When both automatic and manual settings are specified, the Automatic ones
29 // take precedence over the manual ones.
30 //
31 // For more details see:
32 // http://www.chromium.org/developers/design-documents/proxy-settings-fallback
33 class NET_EXPORT ProxyConfig {
34  public:
35   // ProxyRules describes the "manual" proxy settings.
36   // TODO(eroman): Turn this into a class.
37   struct ProxyRules {
38     enum Type {
39       TYPE_NO_RULES,
40       TYPE_SINGLE_PROXY,
41       TYPE_PROXY_PER_SCHEME,
42     };
43 
44     // Note that the default of TYPE_NO_RULES results in direct connections
45     // being made when using this ProxyConfig.
46     ProxyRules();
47     ~ProxyRules();
48 
emptyProxyRules49     bool empty() const {
50       return type == TYPE_NO_RULES;
51     }
52 
53     // Sets |result| with the proxy to use for |url| based on the current rules.
54     void Apply(const GURL& url, ProxyInfo* result);
55 
56     // Parses the rules from a string, indicating which proxies to use.
57     //
58     //   proxy-uri = [<proxy-scheme>"://"]<proxy-host>[":"<proxy-port>]
59     //
60     // If the proxy to use depends on the scheme of the URL, can instead specify
61     // a semicolon separated list of:
62     //
63     //   <url-scheme>"="<proxy-uri>
64     //
65     // For example:
66     //   "http=foopy:80;ftp=foopy2"  -- use HTTP proxy "foopy:80" for http://
67     //                                  URLs, and HTTP proxy "foopy2:80" for
68     //                                  ftp:// URLs.
69     //   "foopy:80"                  -- use HTTP proxy "foopy:80" for all URLs.
70     //   "socks4://foopy"            -- use SOCKS v4 proxy "foopy:1080" for all
71     //                                  URLs.
72     void ParseFromString(const std::string& proxy_rules);
73 
74     // Returns one of {&proxy_for_http, &proxy_for_https, &proxy_for_ftp,
75     // &fallback_proxy}, or NULL if there is no proxy to use.
76     // Should only call this if the type is TYPE_PROXY_PER_SCHEME.
77     const ProxyServer* MapUrlSchemeToProxy(const std::string& url_scheme) const;
78 
79     // Returns true if |*this| describes the same configuration as |other|.
80     bool Equals(const ProxyRules& other) const;
81 
82     // Exceptions for when not to use a proxy.
83     ProxyBypassRules bypass_rules;
84 
85     // Reverse the meaning of |bypass_rules|.
86     bool reverse_bypass;
87 
88     Type type;
89 
90     // Set if |type| is TYPE_SINGLE_PROXY.
91     ProxyServer single_proxy;
92 
93     // Set if |type| is TYPE_PROXY_PER_SCHEME.
94     ProxyServer proxy_for_http;
95     ProxyServer proxy_for_https;
96     ProxyServer proxy_for_ftp;
97 
98     // Used when there isn't a more specific per-scheme proxy server.
99     ProxyServer fallback_proxy;
100 
101    private:
102     // Returns one of {&proxy_for_http, &proxy_for_https, &proxy_for_ftp}
103     // or NULL if it is a scheme that we don't have a mapping
104     // for. Should only call this if the type is TYPE_PROXY_PER_SCHEME.
105     ProxyServer* MapUrlSchemeToProxyNoFallback(const std::string& scheme);
106   };
107 
108   typedef int ID;
109 
110   // Indicates an invalid proxy config.
111   enum { INVALID_ID = 0 };
112 
113   ProxyConfig();
114   ProxyConfig(const ProxyConfig& config);
115   ~ProxyConfig();
116   ProxyConfig& operator=(const ProxyConfig& config);
117 
118   // Used to numerically identify this configuration.
id()119   ID id() const { return id_; }
set_id(int id)120   void set_id(int id) { id_ = id; }
is_valid()121   bool is_valid() const { return id_ != INVALID_ID; }
122 
123   // Returns true if the given config is equivalent to this config.
124   bool Equals(const ProxyConfig& other) const;
125 
126   // Returns true if this config contains any "automatic" settings. See the
127   // class description for what that means.
128   bool HasAutomaticSettings() const;
129 
130   void ClearAutomaticSettings();
131 
132   // Creates a Value dump of this configuration. The caller is responsible for
133   // deleting the returned value.
134   Value* ToValue() const;
135 
proxy_rules()136   ProxyRules& proxy_rules() {
137     return proxy_rules_;
138   }
139 
proxy_rules()140   const ProxyRules& proxy_rules() const {
141     return proxy_rules_;
142   }
143 
set_pac_url(const GURL & url)144   void set_pac_url(const GURL& url) {
145     pac_url_ = url;
146   }
147 
pac_url()148   const GURL& pac_url() const {
149     return pac_url_;
150   }
151 
has_pac_url()152   bool has_pac_url() const {
153     return pac_url_.is_valid();
154   }
155 
set_auto_detect(bool enable_auto_detect)156   void set_auto_detect(bool enable_auto_detect) {
157     auto_detect_ = enable_auto_detect;
158   }
159 
auto_detect()160   bool auto_detect() const {
161     return auto_detect_;
162   }
163 
164   // Helpers to construct some common proxy configurations.
165 
CreateDirect()166   static ProxyConfig CreateDirect() {
167     return ProxyConfig();
168   }
169 
CreateAutoDetect()170   static ProxyConfig CreateAutoDetect() {
171     ProxyConfig config;
172     config.set_auto_detect(true);
173     return config;
174   }
175 
CreateFromCustomPacURL(const GURL & pac_url)176   static ProxyConfig CreateFromCustomPacURL(const GURL& pac_url) {
177     ProxyConfig config;
178     config.set_pac_url(pac_url);
179     return config;
180   }
181 
182  private:
183   // True if the proxy configuration should be auto-detected.
184   bool auto_detect_;
185 
186   // If non-empty, indicates the URL of the proxy auto-config file to use.
187   GURL pac_url_;
188 
189   // Manual proxy settings.
190   ProxyRules proxy_rules_;
191 
192   int id_;
193 };
194 
195 }  // namespace net
196 
197 
198 
199 #endif  // NET_PROXY_PROXY_CONFIG_H_
200