• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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_BYPASS_RULES_H_
6 #define NET_PROXY_PROXY_BYPASS_RULES_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "googleurl/src/gurl.h"
13 
14 namespace net {
15 
16 // ProxyBypassRules describes the set of URLs that should bypass the proxy
17 // settings, as a list of rules. A URL is said to match the bypass rules
18 // if it matches any one of these rules.
19 class ProxyBypassRules {
20  public:
21   // Interface for an individual proxy bypass rule.
22   class Rule {
23    public:
24     Rule();
25     virtual ~Rule();
26 
27     // Returns true if |url| matches the rule.
28     virtual bool Matches(const GURL& url) const = 0;
29 
30     // Returns a string representation of this rule. This is used both for
31     // visualizing the rules, and also to test equality of a rules list.
32     virtual std::string ToString() const = 0;
33 
34     // Creates a copy of this rule. (Caller is responsible for deleting it)
35     virtual Rule* Clone() const = 0;
36 
37     bool Equals(const Rule& rule) const;
38 
39    private:
40     DISALLOW_COPY_AND_ASSIGN(Rule);
41   };
42 
43   typedef std::vector<const Rule*> RuleList;
44 
45   // Note: This class supports copy constructor and assignment.
46   ProxyBypassRules();
47   ProxyBypassRules(const ProxyBypassRules& rhs);
48   ~ProxyBypassRules();
49   ProxyBypassRules& operator=(const ProxyBypassRules& rhs);
50 
51   // Returns the current list of rules. The rules list contains pointers
52   // which are owned by this class, callers should NOT keep references
53   // or delete them.
rules()54   const RuleList& rules() const { return rules_; }
55 
56   // Returns true if |url| matches any of the proxy bypass rules.
57   bool Matches(const GURL& url) const;
58 
59   // Returns true if |*this| is equal to |other|; in other words, whether they
60   // describe the same set of rules.
61   bool Equals(const ProxyBypassRules& other) const;
62 
63   // Initializes the list of rules by parsing the string |raw|. |raw| is a
64   // comma separated list of rules. See AddRuleFromString() to see the list
65   // of supported formats.
66   void ParseFromString(const std::string& raw);
67 
68   // This is a variant of ParseFromString, which interprets hostname patterns
69   // as suffix tests rather than hostname tests (so "google.com" would actually
70   // match "*google.com"). This is only currently used for the linux no_proxy
71   // evironment variable. It is less flexible, since with the suffix matching
72   // format you can't match an individual host.
73   // NOTE: Use ParseFromString() unless you truly need this behavior.
74   void ParseFromStringUsingSuffixMatching(const std::string& raw);
75 
76   // Adds a rule that matches a URL when all of the following are true:
77   //  (a) The URL's scheme matches |optional_scheme|, if
78   //      |!optional_scheme.empty()|
79   //  (b) The URL's hostname matches |hostname_pattern|.
80   //  (c) The URL's (effective) port number matches |optional_port| if
81   //      |optional_port != -1|
82   // Returns true if the rule was successfully added.
83   bool AddRuleForHostname(const std::string& optional_scheme,
84                           const std::string& hostname_pattern,
85                           int optional_port);
86 
87   // Adds a rule that bypasses all "local" hostnames.
88   // This matches IE's interpretation of the
89   // "Bypass proxy server for local addresses" settings checkbox. Fully
90   // qualified domain names or IP addresses are considered non-local,
91   // regardless of what they map to (except for the loopback addresses).
92   void AddRuleToBypassLocal();
93 
94   // Adds a rule given by the string |raw|. The format of |raw| can be any of
95   // the following:
96   //
97   // (1) [ URL_SCHEME "://" ] HOSTNAME_PATTERN [ ":" <port> ]
98   //
99   //   Match all hostnames that match the pattern HOSTNAME_PATTERN.
100   //
101   //   Examples:
102   //     "foobar.com", "*foobar.com", "*.foobar.com", "*foobar.com:99",
103   //     "https://x.*.y.com:99"
104   //
105   // (2) "." HOSTNAME_SUFFIX_PATTERN [ ":" PORT ]
106   //
107   //   Match a particular domain suffix.
108   //
109   //   Examples:
110   //     ".google.com", ".com", "http://.google.com"
111   //
112   // (3) [ SCHEME "://" ] IP_LITERAL [ ":" PORT ]
113   //
114   //   Match URLs which are IP address literals.
115   //
116   //   Conceptually this is the similar to (1), but with special cases
117   //   to handle IP literal canonicalization. For example matching
118   //   on "[0:0:0::1]" would be the same as matching on "[::1]" since
119   //   the IPv6 canonicalization is done internally.
120   //
121   //   Examples:
122   //     "127.0.1", "[0:0::1]", "[::1]", "http://[::1]:99"
123   //
124   // (4)  IP_LITERAL "/" PREFIX_LENGHT_IN_BITS
125   //
126   //   Match any URL that is to an IP literal that falls between the
127   //   given range. IP range is specified using CIDR notation.
128   //
129   //   Examples:
130   //     "192.168.1.1/16", "fefe:13::abc/33".
131   //
132   // (5)  "<local>"
133   //
134   //   Match local addresses. The meaning of "<local>" is whether the
135   //   host matches one of: "127.0.0.1", "::1", "localhost".
136   //
137   // See the unit-tests for more examples.
138   //
139   // Returns true if the rule was successfully added.
140   //
141   // TODO(eroman): support IPv6 literals without brackets.
142   //
143   bool AddRuleFromString(const std::string& raw);
144 
145   // This is a variant of AddFromString, which interprets hostname patterns as
146   // suffix tests rather than hostname tests (so "google.com" would actually
147   // match "*google.com"). This is used for KDE which interprets every rule as
148   // a suffix test. It is less flexible, since with the suffix matching format
149   // you can't match an individual host.
150   //
151   // Returns true if the rule was successfully added.
152   //
153   // NOTE: Use AddRuleFromString() unless you truly need this behavior.
154   bool AddRuleFromStringUsingSuffixMatching(const std::string& raw);
155 
156   // Converts the rules to string representation. Inverse operation to
157   // ParseFromString().
158   std::string ToString() const;
159 
160   // Removes all the rules.
161   void Clear();
162 
163   // Sets |*this| to |other|.
164   void AssignFrom(const ProxyBypassRules& other);
165 
166  private:
167   // The following are variants of ParseFromString() and AddRuleFromString(),
168   // which additionally prefix hostname patterns with a wildcard if
169   // |use_hostname_suffix_matching| was true.
170   void ParseFromStringInternal(const std::string& raw,
171                                bool use_hostname_suffix_matching);
172   bool AddRuleFromStringInternal(const std::string& raw,
173                                  bool use_hostname_suffix_matching);
174   bool AddRuleFromStringInternalWithLogging(const std::string& raw,
175                                             bool use_hostname_suffix_matching);
176 
177   RuleList rules_;
178 };
179 
180 }  // namespace net
181 
182 #endif  // NET_PROXY_PROXY_BYPASS_RULES_H_
183