summaryrefslogtreecommitdiffstats
path: root/net/base
diff options
context:
space:
mode:
Diffstat (limited to 'net/base')
-rw-r--r--net/base/host_resolver.h3
-rw-r--r--net/base/host_resolver_impl.cc9
-rw-r--r--net/base/host_resolver_impl.h7
-rw-r--r--net/base/host_resolver_impl_unittest.cc32
-rw-r--r--net/base/mapped_host_resolver.h1
-rw-r--r--net/base/mock_host_resolver.cc4
-rw-r--r--net/base/mock_host_resolver.h3
7 files changed, 44 insertions, 15 deletions
diff --git a/net/base/host_resolver.h b/net/base/host_resolver.h
index 9fd8dbe4..e4bf847 100644
--- a/net/base/host_resolver.h
+++ b/net/base/host_resolver.h
@@ -167,9 +167,6 @@ class HostResolver : public base::RefCountedThreadSafe<HostResolver> {
// Unregisters an observer previously added by AddObserver().
virtual void RemoveObserver(Observer* observer) = 0;
- // Gives the HostResolver an opportunity to flush state.
- virtual void Flush() {}
-
// Sets the default AddressFamily to use when requests have left it
// unspecified. For example, this could be used to restrict resolution
// results to AF_INET by passing in ADDRESS_FAMILY_IPV4, or to
diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc
index 1f43c60..df5bc79 100644
--- a/net/base/host_resolver_impl.cc
+++ b/net/base/host_resolver_impl.cc
@@ -683,6 +683,8 @@ HostResolverImpl::HostResolverImpl(
#if defined(OS_WIN)
EnsureWinsockInit();
#endif
+ if (network_change_notifier_)
+ network_change_notifier_->AddObserver(this);
}
HostResolverImpl::~HostResolverImpl() {
@@ -697,6 +699,9 @@ HostResolverImpl::~HostResolverImpl() {
if (cur_completing_job_)
cur_completing_job_->Cancel();
+ if (network_change_notifier_)
+ network_change_notifier_->RemoveObserver(this);
+
// Delete the job pools.
for (size_t i = 0u; i < arraysize(job_pools_); ++i)
delete job_pools_[i];
@@ -841,7 +846,7 @@ void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) {
void HostResolverImpl::ProbeIPv6Support() {
DCHECK(!ipv6_probe_monitoring_);
ipv6_probe_monitoring_ = true;
- Flush(); // Give initial setup call.
+ OnIPAddressChanged(); // Give initial setup call.
}
void HostResolverImpl::Shutdown() {
@@ -1074,7 +1079,7 @@ void HostResolverImpl::OnCancelRequest(const BoundNetLog& net_log,
net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL);
}
-void HostResolverImpl::Flush() {
+void HostResolverImpl::OnIPAddressChanged() {
if (cache_.get())
cache_->clear();
if (ipv6_probe_monitoring_) {
diff --git a/net/base/host_resolver_impl.h b/net/base/host_resolver_impl.h
index 4814921..1a182b3 100644
--- a/net/base/host_resolver_impl.h
+++ b/net/base/host_resolver_impl.h
@@ -47,7 +47,8 @@ namespace net {
//
// Requests are ordered in the queue based on their priority.
-class HostResolverImpl : public HostResolver {
+class HostResolverImpl : public HostResolver,
+ public NetworkChangeNotifier::Observer {
public:
// The index into |job_pools_| for the various job pools. Pools with a higher
// index have lower priority.
@@ -87,7 +88,6 @@ class HostResolverImpl : public HostResolver {
virtual void CancelRequest(RequestHandle req);
virtual void AddObserver(HostResolver::Observer* observer);
virtual void RemoveObserver(HostResolver::Observer* observer);
- virtual void Flush();
// Set address family, and disable IPv6 probe support.
virtual void SetDefaultAddressFamily(AddressFamily address_family);
@@ -180,6 +180,9 @@ class HostResolverImpl : public HostResolver {
int request_id,
const RequestInfo& info);
+ // NetworkChangeNotifier::Observer methods:
+ virtual void OnIPAddressChanged();
+
// Notify IPv6ProbeJob not to call back, and discard reference to the job.
void DiscardIPv6ProbeJob();
diff --git a/net/base/host_resolver_impl_unittest.cc b/net/base/host_resolver_impl_unittest.cc
index e9a721c..a17fb6a 100644
--- a/net/base/host_resolver_impl_unittest.cc
+++ b/net/base/host_resolver_impl_unittest.cc
@@ -1043,6 +1043,38 @@ TEST_F(HostResolverImplTest, CancellationObserver) {
CapturingObserver::StartOrCancelEntry(1, info));
}
+// Test that IP address changes flush the cache.
+TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) {
+ MockNetworkChangeNotifier mock_network_change_notifier;
+ scoped_refptr<HostResolver> host_resolver(
+ new HostResolverImpl(NULL, CreateDefaultCache(),
+ &mock_network_change_notifier,
+ kMaxJobs));
+
+ AddressList addrlist;
+
+ // Resolve "host1".
+ HostResolver::RequestInfo info1("host1", 70);
+ TestCompletionCallback callback;
+ int rv = host_resolver->Resolve(info1, &addrlist, &callback, NULL, NULL);
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ EXPECT_EQ(OK, callback.WaitForResult());
+
+ // Resolve "host1" again -- this time it will be served from cache, but it
+ // should still notify of completion.
+ rv = host_resolver->Resolve(info1, &addrlist, &callback, NULL, NULL);
+ ASSERT_EQ(OK, rv); // Should complete synchronously.
+
+ // Flush cache by triggering an IP address change.
+ mock_network_change_notifier.NotifyIPAddressChange();
+
+ // Resolve "host1" again -- this time it won't be served from cache, so it
+ // will complete asynchronously.
+ rv = host_resolver->Resolve(info1, &addrlist, &callback, NULL, NULL);
+ ASSERT_EQ(ERR_IO_PENDING, rv); // Should complete asynchronously.
+ EXPECT_EQ(OK, callback.WaitForResult());
+}
+
// Tests that when the maximum threads is set to 1, requests are dequeued
// in order of priority.
TEST_F(HostResolverImplTest, HigherPriorityRequestsStartedFirst) {
diff --git a/net/base/mapped_host_resolver.h b/net/base/mapped_host_resolver.h
index 890f3072..7339f06 100644
--- a/net/base/mapped_host_resolver.h
+++ b/net/base/mapped_host_resolver.h
@@ -32,7 +32,6 @@ class MappedHostResolver : public HostResolver {
virtual void CancelRequest(RequestHandle req);
virtual void AddObserver(Observer* observer);
virtual void RemoveObserver(Observer* observer);
- virtual void Flush() { impl_->Flush(); }
virtual HostResolverImpl* GetAsHostResolverImpl();
// Adds a rule to this mapper. The format of the rule can be one of:
diff --git a/net/base/mock_host_resolver.cc b/net/base/mock_host_resolver.cc
index 9e57fd1..d99b24e 100644
--- a/net/base/mock_host_resolver.cc
+++ b/net/base/mock_host_resolver.cc
@@ -66,10 +66,6 @@ void MockHostResolverBase::RemoveObserver(Observer* observer) {
impl_->RemoveObserver(observer);
}
-void MockHostResolverBase::Flush() {
- impl_->Flush();
-}
-
void MockHostResolverBase::Reset(HostResolverProc* interceptor) {
synchronous_mode_ = false;
diff --git a/net/base/mock_host_resolver.h b/net/base/mock_host_resolver.h
index ff9f9fc..5a1df7f 100644
--- a/net/base/mock_host_resolver.h
+++ b/net/base/mock_host_resolver.h
@@ -47,12 +47,9 @@ class MockHostResolverBase : public HostResolver {
virtual void CancelRequest(RequestHandle req);
virtual void AddObserver(Observer* observer);
virtual void RemoveObserver(Observer* observer);
- virtual void Flush();
RuleBasedHostResolverProc* rules() { return rules_; }
- const HostCache* cache() const { return impl_->cache(); }
-
// Controls whether resolutions complete synchronously or asynchronously.
void set_synchronous_mode(bool is_synchronous) {
synchronous_mode_ = is_synchronous;