xref: /aosp_15_r20/external/cronet/net/proxy_resolution/proxy_config.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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