Index: net/dns/host_resolver_impl.cc |
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc |
index e84a844a32f7c44a275944ea502a1bdebe4fc505..f294b8c4bdffb0916ebd32ccc078dacac6bab828 100644 |
--- a/net/dns/host_resolver_impl.cc |
+++ b/net/dns/host_resolver_impl.cc |
@@ -1881,11 +1881,16 @@ int HostResolverImpl::Resolve(const RequestInfo& info, |
LogStartRequest(source_net_log, info); |
+ IPAddressNumber ip_number; |
+ IPAddressNumber* ip_number_ptr = nullptr; |
+ if (ParseIPLiteralToNumber(info.hostname(), &ip_number)) |
+ ip_number_ptr = &ip_number; |
+ |
// Build a key that identifies the request in the cache and in the |
// outstanding jobs map. |
- Key key = GetEffectiveKeyForRequest(info, source_net_log); |
+ Key key = GetEffectiveKeyForRequest(info, ip_number_ptr, source_net_log); |
- int rv = ResolveHelper(key, info, addresses, source_net_log); |
+ int rv = ResolveHelper(key, info, ip_number_ptr, addresses, source_net_log); |
if (rv != ERR_DNS_CACHE_MISS) { |
LogFinishRequest(source_net_log, info, rv); |
RecordTotalTime(HaveDnsConfig(), info.is_speculative(), base::TimeDelta()); |
@@ -1931,6 +1936,7 @@ int HostResolverImpl::Resolve(const RequestInfo& info, |
int HostResolverImpl::ResolveHelper(const Key& key, |
const RequestInfo& info, |
+ const IPAddressNumber* ip_number, |
AddressList* addresses, |
const BoundNetLog& source_net_log) { |
// The result of |getaddrinfo| for empty hosts is inconsistent across systems. |
@@ -1940,7 +1946,7 @@ int HostResolverImpl::ResolveHelper(const Key& key, |
return ERR_NAME_NOT_RESOLVED; |
int net_error = ERR_UNEXPECTED; |
- if (ResolveAsIP(key, info, &net_error, addresses)) |
+ if (ResolveAsIP(key, info, ip_number, &net_error, addresses)) |
return net_error; |
if (ServeFromCache(key, info, &net_error, addresses)) { |
source_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CACHE_HIT); |
@@ -1964,9 +1970,14 @@ int HostResolverImpl::ResolveFromCache(const RequestInfo& info, |
// Update the net log and notify registered observers. |
LogStartRequest(source_net_log, info); |
- Key key = GetEffectiveKeyForRequest(info, source_net_log); |
+ IPAddressNumber ip_number; |
+ IPAddressNumber* ip_number_ptr = nullptr; |
+ if (ParseIPLiteralToNumber(info.hostname(), &ip_number)) |
+ ip_number_ptr = &ip_number; |
- int rv = ResolveHelper(key, info, addresses, source_net_log); |
+ Key key = GetEffectiveKeyForRequest(info, ip_number_ptr, source_net_log); |
+ |
+ int rv = ResolveHelper(key, info, ip_number_ptr, addresses, source_net_log); |
LogFinishRequest(source_net_log, info, rv); |
return rv; |
} |
@@ -2021,12 +2032,12 @@ base::Value* HostResolverImpl::GetDnsConfigAsValue() const { |
bool HostResolverImpl::ResolveAsIP(const Key& key, |
const RequestInfo& info, |
+ const IPAddressNumber* ip_number, |
int* net_error, |
AddressList* addresses) { |
DCHECK(addresses); |
DCHECK(net_error); |
- IPAddressNumber ip_number; |
- if (!ParseIPLiteralToNumber(key.hostname, &ip_number)) |
+ if (ip_number == nullptr) |
return false; |
DCHECK_EQ(key.host_resolver_flags & |
@@ -2035,7 +2046,7 @@ bool HostResolverImpl::ResolveAsIP(const Key& key, |
0) << " Unhandled flag"; |
*net_error = OK; |
- AddressFamily family = GetAddressFamily(ip_number); |
+ AddressFamily family = GetAddressFamily(*ip_number); |
if (family == ADDRESS_FAMILY_IPV6 && |
!probe_ipv6_support_ && |
default_address_family_ == ADDRESS_FAMILY_IPV4) { |
@@ -2047,7 +2058,7 @@ bool HostResolverImpl::ResolveAsIP(const Key& key, |
// Don't return IPv6 addresses for IPv4 queries, and vice versa. |
*net_error = ERR_NAME_NOT_RESOLVED; |
} else { |
- *addresses = AddressList::CreateFromIPAddress(ip_number, info.port()); |
+ *addresses = AddressList::CreateFromIPAddress(*ip_number, info.port()); |
if (key.host_resolver_flags & HOST_RESOLVER_CANONNAME) |
addresses->SetDefaultCanonicalName(); |
} |
@@ -2148,19 +2159,24 @@ void HostResolverImpl::SetHaveOnlyLoopbackAddresses(bool result) { |
} |
HostResolverImpl::Key HostResolverImpl::GetEffectiveKeyForRequest( |
- const RequestInfo& info, const BoundNetLog& net_log) const { |
+ const RequestInfo& info, |
+ const IPAddressNumber* ip_number, |
+ const BoundNetLog& net_log) const { |
HostResolverFlags effective_flags = |
info.host_resolver_flags() | additional_resolver_flags_; |
AddressFamily effective_address_family = info.address_family(); |
if (info.address_family() == ADDRESS_FAMILY_UNSPECIFIED) { |
- unsigned char ip_number[4]; |
- url::Component host_comp(0, info.hostname().size()); |
- int num_components; |
if (probe_ipv6_support_ && !use_local_ipv6_ && |
- // Don't bother IPv6 probing when resolving IPv4 literals. |
- url::IPv4AddressToNumber(info.hostname().c_str(), host_comp, ip_number, |
- &num_components) != url::CanonHostInfo::IPV4) { |
+ // When resolving IPv4 literals, there's no need to probe for IPv6. |
+ // When resolving IPv6 literals, there's no benefit to artificially |
+ // limiting our resolution based on a probe. Prior logic ensures |
+ // that this query is UNSPECIFIED (see info.address_family() |
+ // check above) and that |default_address_family_| is UNSPECIFIED |
+ // (|prove_ipv6_support_| is false if |default_address_family_| is |
+ // set) so the code requesting the resolution should be amenable to |
+ // receiving a IPv6 resolution. |
+ ip_number == nullptr) { |
// Google DNS address. |
const uint8 kIPv6Address[] = |
{ 0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00, |