diff options
Diffstat (limited to 'net/proxy/proxy_resolver_v8.cc')
-rw-r--r-- | net/proxy/proxy_resolver_v8.cc | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/net/proxy/proxy_resolver_v8.cc b/net/proxy/proxy_resolver_v8.cc index 80ae06b..a0c9717 100644 --- a/net/proxy/proxy_resolver_v8.cc +++ b/net/proxy/proxy_resolver_v8.cc @@ -21,7 +21,7 @@ #include "gin/array_buffer.h" #include "gin/public/isolate_holder.h" #include "gin/v8_initializer.h" -#include "net/base/ip_address_number.h" +#include "net/base/ip_address.h" #include "net/base/net_errors.h" #include "net/proxy/proxy_info.h" #include "net/proxy/proxy_resolver_script.h" @@ -244,26 +244,29 @@ bool GetHostnameArgument(const v8::FunctionCallbackInfo<v8::Value>& args, return success; } -// Wrapper for passing around IP address strings and IPAddressNumber objects. -struct IPAddress { - IPAddress(const std::string& ip_string, const IPAddressNumber& ip_number) - : string_value(ip_string), - ip_address_number(ip_number) { - } +// Wrapper around an IP address that stores the original string as well as a +// corresponding parsed IPAddress. + +// This struct is used as a helper for sorting IP address strings - the IP +// literal is parsed just once and used as the sorting key, while also +// preserving the original IP literal string. +struct IPAddressSortingEntry { + IPAddressSortingEntry(const std::string& ip_string, + const IPAddress& ip_address) + : string_value(ip_string), ip_address(ip_address) {} // Used for sorting IP addresses in ascending order in SortIpAddressList(). - // IP6 addresses are placed ahead of IPv4 addresses. - bool operator<(const IPAddress& rhs) const { - const IPAddressNumber& ip1 = this->ip_address_number; - const IPAddressNumber& ip2 = rhs.ip_address_number; + // IPv6 addresses are placed ahead of IPv4 addresses. + bool operator<(const IPAddressSortingEntry& rhs) const { + const IPAddress& ip1 = this->ip_address; + const IPAddress& ip2 = rhs.ip_address; if (ip1.size() != ip2.size()) return ip1.size() > ip2.size(); // IPv6 before IPv4. - DCHECK(ip1.size() == ip2.size()); - return memcmp(&ip1[0], &ip2[0], ip1.size()) < 0; // Ascending order. + return ip1 < ip2; // Ascending order. } std::string string_value; - IPAddressNumber ip_address_number; + IPAddress ip_address; }; // Handler for "sortIpAddressList(IpAddressList)". |ip_address_list| is a @@ -284,13 +287,13 @@ bool SortIpAddressList(const std::string& ip_address_list, return false; // Split-up IP addresses and store them in a vector. - std::vector<IPAddress> ip_vector; - IPAddressNumber ip_num; + std::vector<IPAddressSortingEntry> ip_vector; + IPAddress ip_address; base::StringTokenizer str_tok(cleaned_ip_address_list, ";"); while (str_tok.GetNext()) { - if (!ParseIPLiteralToNumber(str_tok.token(), &ip_num)) + if (!ip_address.AssignFromIPLiteral(str_tok.token())) return false; - ip_vector.push_back(IPAddress(str_tok.token(), ip_num)); + ip_vector.push_back(IPAddressSortingEntry(str_tok.token(), ip_address)); } if (ip_vector.empty()) // Can happen if we have something like @@ -320,11 +323,11 @@ bool SortIpAddressList(const std::string& ip_address_list, // format, or if an address and prefix of different types are used (e.g. IPv6 // address and IPv4 prefix). bool IsInNetEx(const std::string& ip_address, const std::string& ip_prefix) { - IPAddressNumber address; - if (!ParseIPLiteralToNumber(ip_address, &address)) + IPAddress address; + if (!address.AssignFromIPLiteral(ip_address)) return false; - IPAddressNumber prefix; + IPAddress prefix; size_t prefix_length_in_bits; if (!ParseCIDRBlock(ip_prefix, &prefix, &prefix_length_in_bits)) return false; @@ -333,10 +336,10 @@ bool IsInNetEx(const std::string& ip_address, const std::string& ip_prefix) { if (address.size() != prefix.size()) return false; - DCHECK((address.size() == 4 && prefix.size() == 4) || - (address.size() == 16 && prefix.size() == 16)); + DCHECK((address.IsIPv4() && prefix.IsIPv4()) || + (address.IsIPv6() && prefix.IsIPv6())); - return IPNumberMatchesPrefix(address, prefix, prefix_length_in_bits); + return IPAddressMatchesPrefix(address, prefix, prefix_length_in_bits); } // Consider only single component domains like 'foo' as plain host names. @@ -346,8 +349,8 @@ bool IsPlainHostName(const std::string& hostname_utf8) { // IPv6 literals might not contain any periods, however are not considered // plain host names. - IPAddressNumber unused; - return !ParseIPLiteralToNumber(hostname_utf8, &unused); + IPAddress unused; + return !unused.AssignFromIPLiteral(hostname_utf8); } // All instances of ProxyResolverV8 share the same v8::Isolate. This isolate is |