| 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/base/host_resolver_impl.h" | 5 #include "net/base/host_resolver_impl.h" |
| 6 | 6 |
| 7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <Winsock2.h> | 8 #include <Winsock2.h> |
| 9 #elif defined(OS_POSIX) | 9 #elif defined(OS_POSIX) |
| 10 #include <netdb.h> | 10 #include <netdb.h> |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 RequestPriority highest_priority_; | 401 RequestPriority highest_priority_; |
| 402 size_t total_count_; | 402 size_t total_count_; |
| 403 size_t counts_[NUM_PRIORITIES]; | 403 size_t counts_[NUM_PRIORITIES]; |
| 404 }; | 404 }; |
| 405 | 405 |
| 406 //----------------------------------------------------------------------------- | 406 //----------------------------------------------------------------------------- |
| 407 | 407 |
| 408 HostResolver* CreateHostResolver(size_t max_concurrent_resolves, | 408 HostResolver* CreateHostResolver(size_t max_concurrent_resolves, |
| 409 size_t max_retry_attempts, | 409 size_t max_retry_attempts, |
| 410 HostCache* cache, | 410 HostCache* cache, |
| 411 scoped_ptr<DnsConfigService> config_service, | |
| 412 scoped_ptr<DnsClient> dns_client, | 411 scoped_ptr<DnsClient> dns_client, |
| 413 NetLog* net_log) { | 412 NetLog* net_log) { |
| 414 if (max_concurrent_resolves == HostResolver::kDefaultParallelism) | 413 if (max_concurrent_resolves == HostResolver::kDefaultParallelism) |
| 415 max_concurrent_resolves = kDefaultMaxProcTasks; | 414 max_concurrent_resolves = kDefaultMaxProcTasks; |
| 416 | 415 |
| 417 // TODO(szym): Add experiments with reserved slots for higher priority | 416 // TODO(szym): Add experiments with reserved slots for higher priority |
| 418 // requests. | 417 // requests. |
| 419 | 418 |
| 420 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, max_concurrent_resolves); | 419 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, max_concurrent_resolves); |
| 421 | 420 |
| 422 HostResolverImpl* resolver = new HostResolverImpl( | 421 HostResolverImpl* resolver = new HostResolverImpl( |
| 423 cache, | 422 cache, |
| 424 limits, | 423 limits, |
| 425 HostResolverImpl::ProcTaskParams(NULL, max_retry_attempts), | 424 HostResolverImpl::ProcTaskParams(NULL, max_retry_attempts), |
| 426 config_service.Pass(), | |
| 427 dns_client.Pass(), | 425 dns_client.Pass(), |
| 428 net_log); | 426 net_log); |
| 429 | 427 |
| 430 return resolver; | 428 return resolver; |
| 431 } | 429 } |
| 432 | 430 |
| 433 } // anonymous namespace | 431 } // anonymous namespace |
| 434 | 432 |
| 435 //----------------------------------------------------------------------------- | 433 //----------------------------------------------------------------------------- |
| 436 | 434 |
| 437 HostResolver* CreateSystemHostResolver(size_t max_concurrent_resolves, | 435 HostResolver* CreateSystemHostResolver(size_t max_concurrent_resolves, |
| 438 size_t max_retry_attempts, | 436 size_t max_retry_attempts, |
| 439 NetLog* net_log) { | 437 NetLog* net_log) { |
| 440 return CreateHostResolver(max_concurrent_resolves, | 438 return CreateHostResolver(max_concurrent_resolves, |
| 441 max_retry_attempts, | 439 max_retry_attempts, |
| 442 HostCache::CreateDefaultCache(), | 440 HostCache::CreateDefaultCache(), |
| 443 DnsConfigService::CreateSystemService(), | |
| 444 scoped_ptr<DnsClient>(NULL), | 441 scoped_ptr<DnsClient>(NULL), |
| 445 net_log); | 442 net_log); |
| 446 } | 443 } |
| 447 | 444 |
| 448 HostResolver* CreateNonCachingSystemHostResolver(size_t max_concurrent_resolves, | 445 HostResolver* CreateNonCachingSystemHostResolver(size_t max_concurrent_resolves, |
| 449 size_t max_retry_attempts, | 446 size_t max_retry_attempts, |
| 450 NetLog* net_log) { | 447 NetLog* net_log) { |
| 451 return CreateHostResolver(max_concurrent_resolves, | 448 return CreateHostResolver(max_concurrent_resolves, |
| 452 max_retry_attempts, | 449 max_retry_attempts, |
| 453 NULL, | 450 NULL, |
| 454 scoped_ptr<DnsConfigService>(NULL), | |
| 455 scoped_ptr<DnsClient>(NULL), | 451 scoped_ptr<DnsClient>(NULL), |
| 456 net_log); | 452 net_log); |
| 457 } | 453 } |
| 458 | 454 |
| 459 HostResolver* CreateAsyncHostResolver(size_t max_concurrent_resolves, | 455 HostResolver* CreateAsyncHostResolver(size_t max_concurrent_resolves, |
| 460 size_t max_retry_attempts, | 456 size_t max_retry_attempts, |
| 461 NetLog* net_log) { | 457 NetLog* net_log) { |
| 462 return CreateHostResolver(max_concurrent_resolves, | 458 return CreateHostResolver(max_concurrent_resolves, |
| 463 max_retry_attempts, | 459 max_retry_attempts, |
| 464 HostCache::CreateDefaultCache(), | 460 HostCache::CreateDefaultCache(), |
| 465 DnsConfigService::CreateSystemService(), | |
| 466 DnsClient::CreateClient(net_log), | 461 DnsClient::CreateClient(net_log), |
| 467 net_log); | 462 net_log); |
| 468 } | 463 } |
| 469 | 464 |
| 470 //----------------------------------------------------------------------------- | 465 //----------------------------------------------------------------------------- |
| 471 | 466 |
| 472 // Holds the data for a request that could not be completed synchronously. | 467 // Holds the data for a request that could not be completed synchronously. |
| 473 // It is owned by a Job. Canceled Requests are only marked as canceled rather | 468 // It is owned by a Job. Canceled Requests are only marked as canceled rather |
| 474 // than removed from the Job's |requests_| list. | 469 // than removed from the Job's |requests_| list. |
| 475 class HostResolverImpl::Request { | 470 class HostResolverImpl::Request { |
| (...skipping 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1656 unresponsive_delay(base::TimeDelta::FromMilliseconds(6000)), | 1651 unresponsive_delay(base::TimeDelta::FromMilliseconds(6000)), |
| 1657 retry_factor(2) { | 1652 retry_factor(2) { |
| 1658 } | 1653 } |
| 1659 | 1654 |
| 1660 HostResolverImpl::ProcTaskParams::~ProcTaskParams() {} | 1655 HostResolverImpl::ProcTaskParams::~ProcTaskParams() {} |
| 1661 | 1656 |
| 1662 HostResolverImpl::HostResolverImpl( | 1657 HostResolverImpl::HostResolverImpl( |
| 1663 HostCache* cache, | 1658 HostCache* cache, |
| 1664 const PrioritizedDispatcher::Limits& job_limits, | 1659 const PrioritizedDispatcher::Limits& job_limits, |
| 1665 const ProcTaskParams& proc_params, | 1660 const ProcTaskParams& proc_params, |
| 1666 scoped_ptr<DnsConfigService> dns_config_service, | |
| 1667 scoped_ptr<DnsClient> dns_client, | 1661 scoped_ptr<DnsClient> dns_client, |
| 1668 NetLog* net_log) | 1662 NetLog* net_log) |
| 1669 : cache_(cache), | 1663 : cache_(cache), |
| 1670 dispatcher_(job_limits), | 1664 dispatcher_(job_limits), |
| 1671 max_queued_jobs_(job_limits.total_jobs * 100u), | 1665 max_queued_jobs_(job_limits.total_jobs * 100u), |
| 1672 proc_params_(proc_params), | 1666 proc_params_(proc_params), |
| 1673 default_address_family_(ADDRESS_FAMILY_UNSPECIFIED), | 1667 default_address_family_(ADDRESS_FAMILY_UNSPECIFIED), |
| 1674 dns_config_service_(dns_config_service.Pass()), | |
| 1675 dns_client_(dns_client.Pass()), | 1668 dns_client_(dns_client.Pass()), |
| 1676 received_dns_config_(false), | 1669 received_dns_config_(false), |
| 1677 ipv6_probe_monitoring_(false), | 1670 ipv6_probe_monitoring_(false), |
| 1678 additional_resolver_flags_(0), | 1671 additional_resolver_flags_(0), |
| 1679 net_log_(net_log) { | 1672 net_log_(net_log) { |
| 1680 | 1673 |
| 1681 DCHECK_GE(dispatcher_.num_priorities(), static_cast<size_t>(NUM_PRIORITIES)); | 1674 DCHECK_GE(dispatcher_.num_priorities(), static_cast<size_t>(NUM_PRIORITIES)); |
| 1682 | 1675 |
| 1683 // Maximum of 4 retry attempts for host resolution. | 1676 // Maximum of 4 retry attempts for host resolution. |
| 1684 static const size_t kDefaultMaxRetryAttempts = 4u; | 1677 static const size_t kDefaultMaxRetryAttempts = 4u; |
| 1685 | 1678 |
| 1686 if (proc_params_.max_retry_attempts == HostResolver::kDefaultRetryAttempts) | 1679 if (proc_params_.max_retry_attempts == HostResolver::kDefaultRetryAttempts) |
| 1687 proc_params_.max_retry_attempts = kDefaultMaxRetryAttempts; | 1680 proc_params_.max_retry_attempts = kDefaultMaxRetryAttempts; |
| 1688 | 1681 |
| 1689 #if defined(OS_WIN) | 1682 #if defined(OS_WIN) |
| 1690 EnsureWinsockInit(); | 1683 EnsureWinsockInit(); |
| 1691 #endif | 1684 #endif |
| 1692 #if defined(OS_POSIX) && !defined(OS_MACOSX) | 1685 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| 1693 if (HaveOnlyLoopbackAddresses()) | 1686 if (HaveOnlyLoopbackAddresses()) |
| 1694 additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY; | 1687 additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY; |
| 1695 #endif | 1688 #endif |
| 1696 NetworkChangeNotifier::AddIPAddressObserver(this); | 1689 NetworkChangeNotifier::AddIPAddressObserver(this); |
| 1690 NetworkChangeNotifier::AddDNSObserver(this); |
| 1691 OnDNSChanged(); |
| 1697 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \ | 1692 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_OPENBSD) && \ |
| 1698 !defined(OS_ANDROID) | 1693 !defined(OS_ANDROID) |
| 1699 EnsureDnsReloaderInit(); | 1694 EnsureDnsReloaderInit(); |
| 1700 #endif | 1695 #endif |
| 1701 | |
| 1702 if (dns_config_service_.get()) { | |
| 1703 dns_config_service_->Watch( | |
| 1704 base::Bind(&HostResolverImpl::OnDnsConfigChanged, | |
| 1705 base::Unretained(this))); | |
| 1706 } | |
| 1707 } | 1696 } |
| 1708 | 1697 |
| 1709 HostResolverImpl::~HostResolverImpl() { | 1698 HostResolverImpl::~HostResolverImpl() { |
| 1710 DiscardIPv6ProbeJob(); | 1699 DiscardIPv6ProbeJob(); |
| 1711 | 1700 |
| 1712 // This will also cancel all outstanding requests. | 1701 // This will also cancel all outstanding requests. |
| 1713 STLDeleteValues(&jobs_); | 1702 STLDeleteValues(&jobs_); |
| 1714 | 1703 |
| 1715 NetworkChangeNotifier::RemoveIPAddressObserver(this); | 1704 NetworkChangeNotifier::RemoveIPAddressObserver(this); |
| 1705 NetworkChangeNotifier::RemoveDNSObserver(this); |
| 1716 } | 1706 } |
| 1717 | 1707 |
| 1718 void HostResolverImpl::SetMaxQueuedJobs(size_t value) { | 1708 void HostResolverImpl::SetMaxQueuedJobs(size_t value) { |
| 1719 DCHECK_EQ(0u, dispatcher_.num_queued_jobs()); | 1709 DCHECK_EQ(0u, dispatcher_.num_queued_jobs()); |
| 1720 DCHECK_GT(value, 0u); | 1710 DCHECK_GT(value, 0u); |
| 1721 max_queued_jobs_ = value; | 1711 max_queued_jobs_ = value; |
| 1722 } | 1712 } |
| 1723 | 1713 |
| 1724 int HostResolverImpl::Resolve(const RequestInfo& info, | 1714 int HostResolverImpl::Resolve(const RequestInfo& info, |
| 1725 AddressList* addresses, | 1715 AddressList* addresses, |
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2107 if (HaveOnlyLoopbackAddresses()) { | 2097 if (HaveOnlyLoopbackAddresses()) { |
| 2108 additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY; | 2098 additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY; |
| 2109 } else { | 2099 } else { |
| 2110 additional_resolver_flags_ &= ~HOST_RESOLVER_LOOPBACK_ONLY; | 2100 additional_resolver_flags_ &= ~HOST_RESOLVER_LOOPBACK_ONLY; |
| 2111 } | 2101 } |
| 2112 #endif | 2102 #endif |
| 2113 AbortAllInProgressJobs(); | 2103 AbortAllInProgressJobs(); |
| 2114 // |this| may be deleted inside AbortAllInProgressJobs(). | 2104 // |this| may be deleted inside AbortAllInProgressJobs(). |
| 2115 } | 2105 } |
| 2116 | 2106 |
| 2117 void HostResolverImpl::OnDnsConfigChanged(const DnsConfig& dns_config) { | 2107 void HostResolverImpl::OnDNSChanged() { |
| 2108 DnsConfig dns_config; |
| 2109 NetworkChangeNotifier::GetDnsConfig(&dns_config); |
| 2118 if (net_log_) { | 2110 if (net_log_) { |
| 2119 net_log_->AddGlobalEntry( | 2111 net_log_->AddGlobalEntry( |
| 2120 NetLog::TYPE_DNS_CONFIG_CHANGED, | 2112 NetLog::TYPE_DNS_CONFIG_CHANGED, |
| 2121 base::Bind(&NetLogDnsConfigCallback, &dns_config)); | 2113 base::Bind(&NetLogDnsConfigCallback, &dns_config)); |
| 2122 } | 2114 } |
| 2123 | 2115 |
| 2124 // TODO(szym): Remove once http://crbug.com/137914 is resolved. | 2116 // TODO(szym): Remove once http://crbug.com/137914 is resolved. |
| 2125 received_dns_config_ = dns_config.IsValid(); | 2117 received_dns_config_ = dns_config.IsValid(); |
| 2126 | 2118 |
| 2127 // Life check to bail once |this| is deleted. | 2119 // Life check to bail once |this| is deleted. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2146 // |this| may be deleted inside AbortAllInProgressJobs(). | 2138 // |this| may be deleted inside AbortAllInProgressJobs(). |
| 2147 if (self) | 2139 if (self) |
| 2148 TryServingAllJobsFromHosts(); | 2140 TryServingAllJobsFromHosts(); |
| 2149 } | 2141 } |
| 2150 | 2142 |
| 2151 bool HostResolverImpl::HaveDnsConfig() const { | 2143 bool HostResolverImpl::HaveDnsConfig() const { |
| 2152 return (dns_client_.get() != NULL) && (dns_client_->GetConfig() != NULL); | 2144 return (dns_client_.get() != NULL) && (dns_client_->GetConfig() != NULL); |
| 2153 } | 2145 } |
| 2154 | 2146 |
| 2155 } // namespace net | 2147 } // namespace net |
| OLD | NEW |