| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/dns/host_resolver_impl.h" | 5 #include "net/dns/host_resolver_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
| 10 #include <Winsock2.h> | 10 #include <Winsock2.h> |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 #include "url/url_canon_ip.h" | 58 #include "url/url_canon_ip.h" |
| 59 | 59 |
| 60 #if defined(OS_WIN) | 60 #if defined(OS_WIN) |
| 61 #include "net/base/winsock_init.h" | 61 #include "net/base/winsock_init.h" |
| 62 #endif | 62 #endif |
| 63 | 63 |
| 64 namespace net { | 64 namespace net { |
| 65 | 65 |
| 66 namespace { | 66 namespace { |
| 67 | 67 |
| 68 // Default delay between calls to the system resolver for the same hostname. |
| 69 // (Can be overridden by field trial.) |
| 70 const int64_t kDnsDefaultUnresponsiveDelayMs = 6000; |
| 71 |
| 68 // Limit the size of hostnames that will be resolved to combat issues in | 72 // Limit the size of hostnames that will be resolved to combat issues in |
| 69 // some platform's resolvers. | 73 // some platform's resolvers. |
| 70 const size_t kMaxHostLength = 4096; | 74 const size_t kMaxHostLength = 4096; |
| 71 | 75 |
| 72 // Default TTL for successful resolutions with ProcTask. | 76 // Default TTL for successful resolutions with ProcTask. |
| 73 const unsigned kCacheEntryTTLSeconds = 60; | 77 const unsigned kCacheEntryTTLSeconds = 60; |
| 74 | 78 |
| 75 // Default TTL for unsuccessful resolutions with ProcTask. | 79 // Default TTL for unsuccessful resolutions with ProcTask. |
| 76 const unsigned kNegativeCacheEntryTTLSeconds = 0; | 80 const unsigned kNegativeCacheEntryTTLSeconds = 0; |
| 77 | 81 |
| (...skipping 1751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1829 PrioritizedDispatcher::Handle handle_; | 1833 PrioritizedDispatcher::Handle handle_; |
| 1830 }; | 1834 }; |
| 1831 | 1835 |
| 1832 //----------------------------------------------------------------------------- | 1836 //----------------------------------------------------------------------------- |
| 1833 | 1837 |
| 1834 HostResolverImpl::ProcTaskParams::ProcTaskParams( | 1838 HostResolverImpl::ProcTaskParams::ProcTaskParams( |
| 1835 HostResolverProc* resolver_proc, | 1839 HostResolverProc* resolver_proc, |
| 1836 size_t max_retry_attempts) | 1840 size_t max_retry_attempts) |
| 1837 : resolver_proc(resolver_proc), | 1841 : resolver_proc(resolver_proc), |
| 1838 max_retry_attempts(max_retry_attempts), | 1842 max_retry_attempts(max_retry_attempts), |
| 1839 unresponsive_delay(base::TimeDelta::FromMilliseconds(6000)), | 1843 unresponsive_delay( |
| 1844 base::TimeDelta::FromMilliseconds(kDnsDefaultUnresponsiveDelayMs)), |
| 1840 retry_factor(2) { | 1845 retry_factor(2) { |
| 1841 // Maximum of 4 retry attempts for host resolution. | 1846 // Maximum of 4 retry attempts for host resolution. |
| 1842 static const size_t kDefaultMaxRetryAttempts = 4u; | 1847 static const size_t kDefaultMaxRetryAttempts = 4u; |
| 1843 if (max_retry_attempts == HostResolver::kDefaultRetryAttempts) | 1848 if (max_retry_attempts == HostResolver::kDefaultRetryAttempts) |
| 1844 max_retry_attempts = kDefaultMaxRetryAttempts; | 1849 max_retry_attempts = kDefaultMaxRetryAttempts; |
| 1845 } | 1850 } |
| 1846 | 1851 |
| 1847 HostResolverImpl::ProcTaskParams::ProcTaskParams(const ProcTaskParams& other) = | 1852 HostResolverImpl::ProcTaskParams::ProcTaskParams(const ProcTaskParams& other) = |
| 1848 default; | 1853 default; |
| 1849 | 1854 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1871 | 1876 |
| 1872 DCHECK_GE(dispatcher_->num_priorities(), static_cast<size_t>(NUM_PRIORITIES)); | 1877 DCHECK_GE(dispatcher_->num_priorities(), static_cast<size_t>(NUM_PRIORITIES)); |
| 1873 | 1878 |
| 1874 #if defined(OS_WIN) | 1879 #if defined(OS_WIN) |
| 1875 EnsureWinsockInit(); | 1880 EnsureWinsockInit(); |
| 1876 #endif | 1881 #endif |
| 1877 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) | 1882 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) |
| 1878 new LoopbackProbeJob(weak_ptr_factory_.GetWeakPtr()); | 1883 new LoopbackProbeJob(weak_ptr_factory_.GetWeakPtr()); |
| 1879 #endif | 1884 #endif |
| 1880 NetworkChangeNotifier::AddIPAddressObserver(this); | 1885 NetworkChangeNotifier::AddIPAddressObserver(this); |
| 1886 NetworkChangeNotifier::AddConnectionTypeObserver(this); |
| 1881 NetworkChangeNotifier::AddDNSObserver(this); | 1887 NetworkChangeNotifier::AddDNSObserver(this); |
| 1882 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \ | 1888 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \ |
| 1883 !defined(OS_ANDROID) | 1889 !defined(OS_ANDROID) |
| 1884 EnsureDnsReloaderInit(); | 1890 EnsureDnsReloaderInit(); |
| 1885 #endif | 1891 #endif |
| 1886 | 1892 |
| 1893 OnConnectionTypeChanged(NetworkChangeNotifier::GetConnectionType()); |
| 1894 |
| 1887 { | 1895 { |
| 1888 DnsConfig dns_config; | 1896 DnsConfig dns_config; |
| 1889 NetworkChangeNotifier::GetDnsConfig(&dns_config); | 1897 NetworkChangeNotifier::GetDnsConfig(&dns_config); |
| 1890 received_dns_config_ = dns_config.IsValid(); | 1898 received_dns_config_ = dns_config.IsValid(); |
| 1891 // Conservatively assume local IPv6 is needed when DnsConfig is not valid. | 1899 // Conservatively assume local IPv6 is needed when DnsConfig is not valid. |
| 1892 use_local_ipv6_ = !dns_config.IsValid() || dns_config.use_local_ipv6; | 1900 use_local_ipv6_ = !dns_config.IsValid() || dns_config.use_local_ipv6; |
| 1893 } | 1901 } |
| 1894 | 1902 |
| 1895 fallback_to_proctask_ = !ConfigureAsyncDnsNoFallbackFieldTrial(); | 1903 fallback_to_proctask_ = !ConfigureAsyncDnsNoFallbackFieldTrial(); |
| 1896 } | 1904 } |
| 1897 | 1905 |
| 1898 HostResolverImpl::~HostResolverImpl() { | 1906 HostResolverImpl::~HostResolverImpl() { |
| 1899 // Prevent the dispatcher from starting new jobs. | 1907 // Prevent the dispatcher from starting new jobs. |
| 1900 dispatcher_->SetLimitsToZero(); | 1908 dispatcher_->SetLimitsToZero(); |
| 1901 // It's now safe for Jobs to call KillDsnTask on destruction, because | 1909 // It's now safe for Jobs to call KillDsnTask on destruction, because |
| 1902 // OnJobComplete will not start any new jobs. | 1910 // OnJobComplete will not start any new jobs. |
| 1903 STLDeleteValues(&jobs_); | 1911 STLDeleteValues(&jobs_); |
| 1904 | 1912 |
| 1905 NetworkChangeNotifier::RemoveIPAddressObserver(this); | 1913 NetworkChangeNotifier::RemoveIPAddressObserver(this); |
| 1914 NetworkChangeNotifier::RemoveConnectionTypeObserver(this); |
| 1906 NetworkChangeNotifier::RemoveDNSObserver(this); | 1915 NetworkChangeNotifier::RemoveDNSObserver(this); |
| 1907 } | 1916 } |
| 1908 | 1917 |
| 1909 void HostResolverImpl::SetMaxQueuedJobs(size_t value) { | 1918 void HostResolverImpl::SetMaxQueuedJobs(size_t value) { |
| 1910 DCHECK_EQ(0u, dispatcher_->num_queued_jobs()); | 1919 DCHECK_EQ(0u, dispatcher_->num_queued_jobs()); |
| 1911 DCHECK_GT(value, 0u); | 1920 DCHECK_GT(value, 0u); |
| 1912 max_queued_jobs_ = value; | 1921 max_queued_jobs_ = value; |
| 1913 } | 1922 } |
| 1914 | 1923 |
| 1915 int HostResolverImpl::Resolve(const RequestInfo& info, | 1924 int HostResolverImpl::Resolve(const RequestInfo& info, |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2334 probe_weak_ptr_factory_.InvalidateWeakPtrs(); | 2343 probe_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 2335 if (cache_.get()) | 2344 if (cache_.get()) |
| 2336 cache_->clear(); | 2345 cache_->clear(); |
| 2337 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) | 2346 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) |
| 2338 new LoopbackProbeJob(probe_weak_ptr_factory_.GetWeakPtr()); | 2347 new LoopbackProbeJob(probe_weak_ptr_factory_.GetWeakPtr()); |
| 2339 #endif | 2348 #endif |
| 2340 AbortAllInProgressJobs(); | 2349 AbortAllInProgressJobs(); |
| 2341 // |this| may be deleted inside AbortAllInProgressJobs(). | 2350 // |this| may be deleted inside AbortAllInProgressJobs(). |
| 2342 } | 2351 } |
| 2343 | 2352 |
| 2353 void HostResolverImpl::OnConnectionTypeChanged( |
| 2354 NetworkChangeNotifier::ConnectionType type) { |
| 2355 proc_params_.unresponsive_delay = |
| 2356 GetTimeDeltaForConnectionTypeFromFieldTrialOrDefault( |
| 2357 "DnsUnresponsiveDelayMsByConnectionType", |
| 2358 base::TimeDelta::FromMilliseconds(kDnsDefaultUnresponsiveDelayMs), |
| 2359 type); |
| 2360 } |
| 2361 |
| 2344 void HostResolverImpl::OnInitialDNSConfigRead() { | 2362 void HostResolverImpl::OnInitialDNSConfigRead() { |
| 2345 UpdateDNSConfig(false); | 2363 UpdateDNSConfig(false); |
| 2346 } | 2364 } |
| 2347 | 2365 |
| 2348 void HostResolverImpl::OnDNSChanged() { | 2366 void HostResolverImpl::OnDNSChanged() { |
| 2349 UpdateDNSConfig(true); | 2367 UpdateDNSConfig(true); |
| 2350 } | 2368 } |
| 2351 | 2369 |
| 2352 void HostResolverImpl::UpdateDNSConfig(bool config_changed) { | 2370 void HostResolverImpl::UpdateDNSConfig(bool config_changed) { |
| 2353 DnsConfig dns_config; | 2371 DnsConfig dns_config; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2442 dns_client_->SetConfig(dns_config); | 2460 dns_client_->SetConfig(dns_config); |
| 2443 num_dns_failures_ = 0; | 2461 num_dns_failures_ = 0; |
| 2444 if (dns_client_->GetConfig()) | 2462 if (dns_client_->GetConfig()) |
| 2445 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true); | 2463 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true); |
| 2446 } | 2464 } |
| 2447 | 2465 |
| 2448 AbortDnsTasks(); | 2466 AbortDnsTasks(); |
| 2449 } | 2467 } |
| 2450 | 2468 |
| 2451 } // namespace net | 2469 } // namespace net |
| OLD | NEW |