Index: net/dns/host_resolver_impl.cc |
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc |
index 970ec1f457ade5ba90b1b2ac6224f57e782c0271..cc7e976bb383edc945d108e259934c5c617940be 100644 |
--- a/net/dns/host_resolver_impl.cc |
+++ b/net/dns/host_resolver_impl.cc |
@@ -74,8 +74,6 @@ const unsigned kNegativeCacheEntryTTLSeconds = 0; |
// Minimum TTL for successful resolutions with DnsTask. |
const unsigned kMinimumTTLSeconds = kCacheEntryTTLSeconds; |
-const char kLocalhost[] = "localhost."; |
- |
// Time between IPv6 probes, i.e. for how long results of each IPv6 probe are |
// cached. |
const int kIPv6ProbePeriodMs = 1000; |
@@ -1318,13 +1316,7 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job, |
} |
void AddRequest(scoped_ptr<Request> req) { |
- // .localhost queries are redirected to "localhost." to make sure |
- // that they are never sent out on the network, per RFC 6761. |
- if (IsLocalhostTLD(req->info().hostname())) { |
- DCHECK_EQ(key_.hostname, kLocalhost); |
- } else { |
- DCHECK_EQ(key_.hostname, req->info().hostname()); |
- } |
+ DCHECK_EQ(key_.hostname, req->info().hostname()); |
req->set_job(this); |
priority_tracker_.Add(req->priority()); |
@@ -1997,6 +1989,10 @@ int HostResolverImpl::ResolveHelper(const Key& key, |
source_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_HOSTS_HIT); |
return OK; |
} |
+ |
+ if (ServeLocalhost(key, info, addresses)) |
estark
2015/06/11 17:16:48
Another thing to flag: one consequence of this cha
|
+ return OK; |
+ |
return ERR_DNS_CACHE_MISS; |
} |
@@ -2159,6 +2155,48 @@ bool HostResolverImpl::ServeFromHosts(const Key& key, |
return !addresses->empty(); |
} |
+bool HostResolverImpl::ServeLocalhost(const Key& key, |
+ const RequestInfo& info, |
+ AddressList* addresses) { |
+ const unsigned char kLocalhostIPv4[] = {127, 0, 0, 1}; |
+ const unsigned char kLocalhostIPv6[] = { |
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; |
+ |
+ bool isLocalhost6; |
+ if (!IsLocalhostHostname(key.hostname, &isLocalhost6)) |
+ return false; |
+ |
+ addresses->clear(); |
+ |
+ bool use_ipv4 = |
+ !isLocalhost6 && (key.address_family == ADDRESS_FAMILY_IPV4 || |
+ key.address_family == ADDRESS_FAMILY_UNSPECIFIED); |
+ // If the family was restricted to IPv4 due to a detected lack of IPv6 |
+ // support, resolve with no restrictions. See SystemHostResolverCall |
+ // for rationale. |
+ bool use_ipv6 = key.address_family == ADDRESS_FAMILY_IPV6 || |
+ key.address_family == ADDRESS_FAMILY_UNSPECIFIED || |
+ (key.address_family == ADDRESS_FAMILY_IPV4 && |
+ (key.host_resolver_flags & |
+ HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6)); |
+ |
+ if (use_ipv4) { |
+ addresses->push_back( |
+ IPEndPoint(IPAddressNumber(kLocalhostIPv4, |
+ kLocalhostIPv4 + arraysize(kLocalhostIPv4)), |
+ info.port())); |
+ } |
+ |
+ if (use_ipv6) { |
+ addresses->push_back( |
+ IPEndPoint(IPAddressNumber(kLocalhostIPv6, |
+ kLocalhostIPv6 + arraysize(kLocalhostIPv6)), |
+ info.port())); |
+ } |
+ |
+ return true; |
+} |
+ |
void HostResolverImpl::CacheResult(const Key& key, |
const HostCache::Entry& entry, |
base::TimeDelta ttl) { |
@@ -2205,13 +2243,7 @@ HostResolverImpl::Key HostResolverImpl::GetEffectiveKeyForRequest( |
} |
} |
- std::string hostname = info.hostname(); |
- // Redirect .localhost queries to "localhost." to make sure that they |
- // are never sent out on the network, per RFC 6761. |
- if (IsLocalhostTLD(info.hostname())) |
- hostname = kLocalhost; |
- |
- return Key(hostname, effective_address_family, effective_flags); |
+ return Key(info.hostname(), effective_address_family, effective_flags); |
} |
bool HostResolverImpl::IsIPv6Reachable(const BoundNetLog& net_log) { |