Index: net/base/mock_host_resolver.cc |
diff --git a/net/base/mock_host_resolver.cc b/net/base/mock_host_resolver.cc |
index d99b24eeb0f1f20bdea241cfd5147e5d281fd3cb..573d57e4be0e02ac513a91cd38b3f19907ce2648 100644 |
--- a/net/base/mock_host_resolver.cc |
+++ b/net/base/mock_host_resolver.cc |
@@ -13,10 +13,14 @@ |
namespace net { |
namespace { |
-// Fills |addrlist| with a socket address for |host| which should be an |
-// IPv6 literal. Returns OK on success. |
-int ResolveIPV6LiteralUsingGURL(const std::string& host, |
- AddressList* addrlist) { |
+ |
+// Fills |*addrlist| with a socket address for |host| which should be an |
+// IPv6 literal without enclosing brackets. If |canonical_name| is non-empty |
+// it is used as the DNS canonical name for the host. Returns OK on success, |
+// ERR_UNEXPECTED otherwise. |
+int CreateIPv6Address(const std::string& host, |
+ const std::string& canonical_name, |
+ AddressList* addrlist) { |
// GURL expects the hostname to be surrounded with brackets. |
std::string host_brackets = "[" + host + "]"; |
url_parse::Component host_comp(0, host_brackets.size()); |
@@ -31,7 +35,26 @@ int ResolveIPV6LiteralUsingGURL(const std::string& host, |
return ERR_UNEXPECTED; |
} |
- *addrlist = AddressList::CreateIPv6Address(ipv6_addr); |
+ *addrlist = AddressList::CreateIPv6Address(ipv6_addr, canonical_name); |
+ return OK; |
+} |
+ |
+// Fills |*addrlist| with a socket address for |host| which should be an |
+// IPv4 literal. If |canonical_name| is non-empty it is used as the DNS |
+// canonical name for the host. Returns OK on success, ERR_UNEXPECTED otherwise. |
+int CreateIPv4Address(const std::string& host, |
+ const std::string& canonical_name, |
+ AddressList* addrlist) { |
+ unsigned char ipv4_addr[4]; |
+ url_parse::Component host_comp(0, host.size()); |
+ int num_components; |
+ url_canon::CanonHostInfo::Family family = url_canon::IPv4AddressToNumber( |
+ host.data(), host_comp, ipv4_addr, &num_components); |
+ if (family != url_canon::CanonHostInfo::IPV4) { |
+ LOG(WARNING) << "Not an IPv4 literal: " << host; |
+ return ERR_UNEXPECTED; |
+ } |
+ *addrlist = AddressList::CreateIPv4Address(ipv4_addr, canonical_name); |
return OK; |
} |
@@ -104,23 +127,30 @@ struct RuleBasedHostResolverProc::Rule { |
kResolverTypeFail, |
kResolverTypeSystem, |
kResolverTypeIPV6Literal, |
+ kResolverTypeIPV4Literal, |
}; |
ResolverType resolver_type; |
std::string host_pattern; |
AddressFamily address_family; |
+ HostResolverFlags host_resolver_flags; |
std::string replacement; |
+ std::string canonical_name; |
int latency_ms; // In milliseconds. |
Rule(ResolverType resolver_type, |
const std::string& host_pattern, |
AddressFamily address_family, |
+ HostResolverFlags host_resolver_flags, |
const std::string& replacement, |
+ const std::string& canonical_name, |
int latency_ms) |
: resolver_type(resolver_type), |
host_pattern(host_pattern), |
address_family(address_family), |
+ host_resolver_flags(host_resolver_flags), |
replacement(replacement), |
+ canonical_name(canonical_name), |
latency_ms(latency_ms) {} |
}; |
@@ -143,16 +173,32 @@ void RuleBasedHostResolverProc::AddRuleForAddressFamily( |
const std::string& replacement) { |
DCHECK(!replacement.empty()); |
Rule rule(Rule::kResolverTypeSystem, host_pattern, |
- address_family, replacement, 0); |
+ address_family, 0, replacement, "", 0); |
+ rules_.push_back(rule); |
+} |
+ |
+void RuleBasedHostResolverProc::AddIPv4Rule(const std::string& host_pattern, |
+ const std::string& ipv4_literal, |
+ const std::string& canonical_name) { |
+ Rule rule(Rule::kResolverTypeIPV4Literal, |
+ host_pattern, |
+ ADDRESS_FAMILY_UNSPECIFIED, |
+ canonical_name.empty() ? 0 : HOST_RESOLVER_CANONNAME, |
+ ipv4_literal, |
+ canonical_name, |
+ 0); |
rules_.push_back(rule); |
} |
void RuleBasedHostResolverProc::AddIPv6Rule(const std::string& host_pattern, |
- const std::string& ipv6_literal) { |
+ const std::string& ipv6_literal, |
+ const std::string& canonical_name) { |
Rule rule(Rule::kResolverTypeIPV6Literal, |
host_pattern, |
ADDRESS_FAMILY_UNSPECIFIED, |
+ canonical_name.empty() ? 0 : HOST_RESOLVER_CANONNAME, |
ipv6_literal, |
+ canonical_name, |
0); |
rules_.push_back(rule); |
} |
@@ -163,21 +209,21 @@ void RuleBasedHostResolverProc::AddRuleWithLatency( |
int latency_ms) { |
DCHECK(!replacement.empty()); |
Rule rule(Rule::kResolverTypeSystem, host_pattern, |
- ADDRESS_FAMILY_UNSPECIFIED, replacement, latency_ms); |
+ ADDRESS_FAMILY_UNSPECIFIED, 0, replacement, "", latency_ms); |
rules_.push_back(rule); |
} |
void RuleBasedHostResolverProc::AllowDirectLookup( |
const std::string& host_pattern) { |
Rule rule(Rule::kResolverTypeSystem, host_pattern, |
- ADDRESS_FAMILY_UNSPECIFIED, "", 0); |
+ ADDRESS_FAMILY_UNSPECIFIED, 0, "", "", 0); |
rules_.push_back(rule); |
} |
void RuleBasedHostResolverProc::AddSimulatedFailure( |
const std::string& host_pattern) { |
Rule rule(Rule::kResolverTypeFail, host_pattern, |
- ADDRESS_FAMILY_UNSPECIFIED, "", 0); |
+ ADDRESS_FAMILY_UNSPECIFIED, 0, "", "", 0); |
rules_.push_back(rule); |
} |
@@ -190,8 +236,14 @@ int RuleBasedHostResolverProc::Resolve(const std::string& host, |
bool matches_address_family = |
r->address_family == ADDRESS_FAMILY_UNSPECIFIED || |
r->address_family == address_family; |
- |
- if (matches_address_family && MatchPatternASCII(host, r->host_pattern)) { |
+ // Flags match if all of the bitflags in host_resolver_flags are enabled |
+ // in the rule's host_resolver_flags. However, the rule may have additional |
+ // flags specified, in which case the flags should still be considered a |
+ // match. |
+ bool matches_flags = (r->host_resolver_flags & host_resolver_flags) == |
+ host_resolver_flags; |
+ if (matches_flags && matches_address_family && |
+ MatchPatternASCII(host, r->host_pattern)) { |
if (r->latency_ms != 0) |
PlatformThread::Sleep(r->latency_ms); |
@@ -209,7 +261,9 @@ int RuleBasedHostResolverProc::Resolve(const std::string& host, |
host_resolver_flags, |
addrlist); |
case Rule::kResolverTypeIPV6Literal: |
- return ResolveIPV6LiteralUsingGURL(effective_host, addrlist); |
+ return CreateIPv6Address(effective_host, r->canonical_name, addrlist); |
+ case Rule::kResolverTypeIPV4Literal: |
+ return CreateIPv4Address(effective_host, r->canonical_name, addrlist); |
default: |
NOTREACHED(); |
return ERR_UNEXPECTED; |