| OLD | NEW |
| (Empty) |
| 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 | |
| 8 #include <string> | |
| 9 #include <vector> | |
| 10 | |
| 11 #include "net/base/net_export.h" | |
| 12 #include "url/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 NET_EXPORT ProxyBypassRules { | |
| 20 public: | |
| 21 // Interface for an individual proxy bypass rule. | |
| 22 class NET_EXPORT 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. | |
| 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_ | |
| OLD | NEW |