OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 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 |