OLD | NEW |
| (Empty) |
1 // Copyright 2014 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_BASE_IP_MAPPING_RULES_H_ | |
6 #define NET_BASE_IP_MAPPING_RULES_H_ | |
7 | |
8 #include <string> | |
9 #include <vector> | |
10 | |
11 #include "base/macros.h" | |
12 #include "net/base/net_export.h" | |
13 | |
14 namespace net { | |
15 | |
16 class AddressList; | |
17 | |
18 // This class contains a list of rules, that can be used to process (Rewrite) a | |
19 // set of DNS resolutions (IP addresses) in accordance with those rules. | |
20 // Currently the only rules supported use a pattern match against some given IP | |
21 // addresses, and may, if there is a match, place one new IP address at the | |
22 // start of the rewritten address list (re: the "PREFACE" directive). This | |
23 // supports a common use case where the matching detects an address in a given | |
24 // edge network server group, and the inserted address points to a server that | |
25 // is expected to handle all requests that would otherwise have gone to the | |
26 // given group of servers. | |
27 class NET_EXPORT_PRIVATE IPMappingRules { | |
28 public: | |
29 IPMappingRules(); | |
30 ~IPMappingRules(); | |
31 | |
32 // Modifies |*addresses| based on the current rules. Returns true if | |
33 // |addresses| was modified, false otherwise. | |
34 bool RewriteAddresses(AddressList* addresses) const; | |
35 | |
36 // Adds a rule to this mapper. | |
37 // Rules are evaluated against an address list until a first matching rule is | |
38 // found that applies, causing a modification of the address list. | |
39 // Each rule consists of one or more of the following pattern and action | |
40 // directives. | |
41 // | |
42 // RULE: CHANGE_DIRECTIVE | EMPTY | |
43 // CHANGE_DIRECTIVE: "PREFACE" SPACE IP_PATTERN SPACE IP_LITERAL | |
44 // SPACE: " " | |
45 // EMPTY: | |
46 // | |
47 // IP_LITERAL: IP_V6_LITERAL | IP_V4_LITERAL | |
48 // | |
49 // IP_V4_LITERAL: OCTET "." OCTET "." OCTET "." OCTET | |
50 // OCTET: decimal number in range 0 ... 255 | |
51 // | |
52 // IP_V6_LITERAL: HEX_COMPONENT | IP_V6_LITERAL ":" HEX_COMPONENT | |
53 // HEX_COMPONENT: hexadecimal values with no more than 4 hex digits | |
54 // | |
55 // IP_PATTERN: IP_V6_PATTERN | IP_V4_PATTERN | |
56 // | |
57 // IP_V6_PATTERN: HEX_PATTERN | IP_V6_PATTERN ":" HEX_PATTERN | |
58 // HEX_PATTERN: HEX_COMPONENT | "[" HEX_GROUP_PATTERN "]" | "*" | |
59 // HEX_GROUP_PATTERN: HEX_RANGE | HEX_GROUP_PATTERN "," HEX_RANGE | |
60 // HEX_RANGE: HEX_COMPONENT | HEX_COMPONENT "-" HEX_COMPONENT | |
61 // | |
62 // IP_V4_PATTERN: OCTET_PATTERN "." OCTET_PATTERN "." OCTET_PATTERN | |
63 // "." OCTET_PATTERN | |
64 // OCTET_PATTERN: OCTET | "[" OCTET_GROUP_PATTERN "]" | "*" | |
65 // OCTET_GROUP_PATTERN: OCTET_RANGE | OCTET_GROUP_PATTERN "," OCTET_RANGE | |
66 // OCTET_RANGE: OCTET | OCTET "-" OCTET | |
67 // | |
68 // All literals are required to have all their components specified (4 | |
69 // components for IPv4, and 8 for IPv6). Specifically, there is currently no | |
70 // support for elided compenents in an IPv6 address (e.g., "::"). | |
71 // Returns true if the rule was successfully parsed and added. | |
72 bool AddRuleFromString(const std::string& rule_string); | |
73 | |
74 // Sets the rules from a semicolon separated list of rules. | |
75 // Returns true if all the rules were successfully parsed and added. | |
76 bool SetRulesFromString(const std::string& rules_string); | |
77 | |
78 private: | |
79 class Rule; | |
80 typedef std::vector<Rule*> RuleList; | |
81 | |
82 // We own all rules in this list, and are responsible for their destruction. | |
83 RuleList rules_; | |
84 | |
85 DISALLOW_COPY_AND_ASSIGN(IPMappingRules); | |
86 }; | |
87 | |
88 } // namespace net | |
89 | |
90 #endif // NET_BASE_IP_MAPPING_RULES_H_ | |
OLD | NEW |