diff options
Diffstat (limited to 'net/socket')
-rw-r--r-- | net/socket/client_socket_pool_base.cc | 14 | ||||
-rw-r--r-- | net/socket/client_socket_pool_base.h | 18 | ||||
-rw-r--r-- | net/socket/client_socket_pool_base_unittest.cc | 2 | ||||
-rw-r--r-- | net/socket/socks_client_socket_pool.cc | 6 | ||||
-rw-r--r-- | net/socket/socks_client_socket_pool.h | 3 | ||||
-rw-r--r-- | net/socket/socks_client_socket_pool_unittest.cc | 15 | ||||
-rw-r--r-- | net/socket/tcp_client_socket_pool.cc | 6 | ||||
-rw-r--r-- | net/socket/tcp_client_socket_pool.h | 3 | ||||
-rw-r--r-- | net/socket/tcp_client_socket_pool_unittest.cc | 31 |
9 files changed, 79 insertions, 19 deletions
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc index eb1cd51..4b6cff0 100644 --- a/net/socket/client_socket_pool_base.cc +++ b/net/socket/client_socket_pool_base.cc @@ -110,7 +110,8 @@ ClientSocketPoolBaseHelper::ClientSocketPoolBaseHelper( int max_sockets_per_group, base::TimeDelta unused_idle_socket_timeout, base::TimeDelta used_idle_socket_timeout, - ConnectJobFactory* connect_job_factory) + ConnectJobFactory* connect_job_factory, + NetworkChangeNotifier* network_change_notifier) : idle_socket_count_(0), connecting_socket_count_(0), handed_out_socket_count_(0), @@ -120,10 +121,14 @@ ClientSocketPoolBaseHelper::ClientSocketPoolBaseHelper( used_idle_socket_timeout_(used_idle_socket_timeout), may_have_stalled_group_(false), connect_job_factory_(connect_job_factory), + network_change_notifier_(network_change_notifier), backup_jobs_enabled_(false), ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { DCHECK_LE(0, max_sockets_per_group); DCHECK_LE(max_sockets_per_group, max_sockets); + + if (network_change_notifier_) + network_change_notifier_->AddObserver(this); } ClientSocketPoolBaseHelper::~ClientSocketPoolBaseHelper() { @@ -135,6 +140,9 @@ ClientSocketPoolBaseHelper::~ClientSocketPoolBaseHelper() { CloseIdleSockets(); CHECK(group_map_.empty()); DCHECK_EQ(0, connecting_socket_count_); + + if (network_change_notifier_) + network_change_notifier_->RemoveObserver(this); } // InsertRequestIntoQueue inserts the request into the queue based on @@ -583,6 +591,10 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete( } } +void ClientSocketPoolBaseHelper::OnIPAddressChanged() { + CloseIdleSockets(); +} + void ClientSocketPoolBaseHelper::RemoveConnectJob(const ConnectJob *job, Group* group) { CHECK_GT(connecting_socket_count_, 0); diff --git a/net/socket/client_socket_pool_base.h b/net/socket/client_socket_pool_base.h index 75572cf..d1abd58 100644 --- a/net/socket/client_socket_pool_base.h +++ b/net/socket/client_socket_pool_base.h @@ -39,6 +39,7 @@ #include "net/base/load_states.h" #include "net/base/net_errors.h" #include "net/base/net_log.h" +#include "net/base/network_change_notifier.h" #include "net/base/request_priority.h" #include "net/socket/client_socket.h" #include "net/socket/client_socket_pool.h" @@ -121,7 +122,8 @@ namespace internal { // ClientSocketPoolBase instead. class ClientSocketPoolBaseHelper : public base::RefCounted<ClientSocketPoolBaseHelper>, - public ConnectJob::Delegate { + public ConnectJob::Delegate, + public NetworkChangeNotifier::Observer { public: class Request { public: @@ -168,7 +170,8 @@ class ClientSocketPoolBaseHelper int max_sockets_per_group, base::TimeDelta unused_idle_socket_timeout, base::TimeDelta used_idle_socket_timeout, - ConnectJobFactory* connect_job_factory); + ConnectJobFactory* connect_job_factory, + NetworkChangeNotifier* network_change_notifier); // See ClientSocketPool::RequestSocket for documentation on this function. // Note that |request| must be heap allocated. If ERR_IO_PENDING is returned, @@ -208,6 +211,9 @@ class ClientSocketPoolBaseHelper // ConnectJob::Delegate methods: virtual void OnConnectJobComplete(int result, ConnectJob* job); + // NetworkChangeNotifier::Observer methods: + virtual void OnIPAddressChanged(); + // For testing. bool may_have_stalled_group() const { return may_have_stalled_group_; } @@ -428,6 +434,8 @@ class ClientSocketPoolBaseHelper const scoped_ptr<ConnectJobFactory> connect_job_factory_; + NetworkChangeNotifier* const network_change_notifier_; + // TODO(vandebo) Remove when backup jobs move to TCPClientSocketPool bool backup_jobs_enabled_; @@ -494,12 +502,14 @@ class ClientSocketPoolBase { const std::string& name, base::TimeDelta unused_idle_socket_timeout, base::TimeDelta used_idle_socket_timeout, - ConnectJobFactory* connect_job_factory) + ConnectJobFactory* connect_job_factory, + NetworkChangeNotifier* network_change_notifier) : name_(name), helper_(new internal::ClientSocketPoolBaseHelper( max_sockets, max_sockets_per_group, unused_idle_socket_timeout, used_idle_socket_timeout, - new ConnectJobFactoryAdaptor(connect_job_factory))) {} + new ConnectJobFactoryAdaptor(connect_job_factory), + network_change_notifier)) {} virtual ~ClientSocketPoolBase() {} diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc index 2b25785..a706df8 100644 --- a/net/socket/client_socket_pool_base_unittest.cc +++ b/net/socket/client_socket_pool_base_unittest.cc @@ -282,7 +282,7 @@ class TestClientSocketPool : public ClientSocketPool { TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) : base_(max_sockets, max_sockets_per_group, name, unused_idle_socket_timeout, used_idle_socket_timeout, - connect_job_factory) {} + connect_job_factory, NULL) {} virtual int RequestSocket( const std::string& group_name, diff --git a/net/socket/socks_client_socket_pool.cc b/net/socket/socks_client_socket_pool.cc index 36d12ba..246cc20 100644 --- a/net/socket/socks_client_socket_pool.cc +++ b/net/socket/socks_client_socket_pool.cc @@ -161,11 +161,13 @@ SOCKSClientSocketPool::SOCKSClientSocketPool( int max_sockets_per_group, const std::string& name, const scoped_refptr<HostResolver>& host_resolver, - const scoped_refptr<TCPClientSocketPool>& tcp_pool) + const scoped_refptr<TCPClientSocketPool>& tcp_pool, + NetworkChangeNotifier* network_change_notifier) : base_(max_sockets, max_sockets_per_group, name, base::TimeDelta::FromSeconds(kUnusedIdleSocketTimeout), base::TimeDelta::FromSeconds(kUsedIdleSocketTimeout), - new SOCKSConnectJobFactory(tcp_pool, host_resolver)) {} + new SOCKSConnectJobFactory(tcp_pool, host_resolver), + network_change_notifier) {} SOCKSClientSocketPool::~SOCKSClientSocketPool() {} diff --git a/net/socket/socks_client_socket_pool.h b/net/socket/socks_client_socket_pool.h index f74074a..2c30600 100644 --- a/net/socket/socks_client_socket_pool.h +++ b/net/socket/socks_client_socket_pool.h @@ -108,7 +108,8 @@ class SOCKSClientSocketPool : public ClientSocketPool { int max_sockets_per_group, const std::string& name, const scoped_refptr<HostResolver>& host_resolver, - const scoped_refptr<TCPClientSocketPool>& tcp_pool); + const scoped_refptr<TCPClientSocketPool>& tcp_pool, + NetworkChangeNotifier* network_change_notifier); // ClientSocketPool methods: virtual int RequestSocket(const std::string& group_name, diff --git a/net/socket/socks_client_socket_pool_unittest.cc b/net/socket/socks_client_socket_pool_unittest.cc index cef7ff6..4291f3c 100644 --- a/net/socket/socks_client_socket_pool_unittest.cc +++ b/net/socket/socks_client_socket_pool_unittest.cc @@ -10,6 +10,7 @@ #include "base/compiler_specific.h" #include "base/time.h" #include "net/base/mock_host_resolver.h" +#include "net/base/mock_network_change_notifier.h" #include "net/base/net_errors.h" #include "net/base/test_completion_callback.h" #include "net/socket/client_socket_factory.h" @@ -83,9 +84,10 @@ class MockTCPClientSocketPool : public TCPClientSocketPool { MockTCPClientSocketPool(int max_sockets, int max_sockets_per_group, const std::string& name, - ClientSocketFactory* socket_factory) + ClientSocketFactory* socket_factory, + NetworkChangeNotifier* network_change_notifier) : TCPClientSocketPool(max_sockets, max_sockets_per_group, name, - NULL, NULL), + NULL, NULL, network_change_notifier), client_socket_factory_(socket_factory), release_count_(0), cancel_count_(0) {} @@ -169,12 +171,11 @@ class SOCKSClientSocketPoolTest : public ClientSocketPoolTest { : ignored_tcp_socket_params_("proxy", 80, MEDIUM, GURL(), false), tcp_socket_pool_(new MockTCPClientSocketPool( kMaxSockets, kMaxSocketsPerGroup, "MockTCP", - &tcp_client_socket_factory_)), + &tcp_client_socket_factory_, &tcp_notifier_)), ignored_socket_params_(ignored_tcp_socket_params_, true, "host", 80, MEDIUM, GURL()), - pool_(new SOCKSClientSocketPool( - kMaxSockets, kMaxSocketsPerGroup, - "SOCKSUnitTest", NULL, tcp_socket_pool_.get())) { + pool_(new SOCKSClientSocketPool(kMaxSockets, kMaxSocketsPerGroup, + "SOCKSUnitTest", NULL, tcp_socket_pool_.get(), &socks_notifier_)) { } int StartRequest(const std::string& group_name, RequestPriority priority) { @@ -184,9 +185,11 @@ class SOCKSClientSocketPoolTest : public ClientSocketPoolTest { TCPSocketParams ignored_tcp_socket_params_; MockClientSocketFactory tcp_client_socket_factory_; + MockNetworkChangeNotifier tcp_notifier_; scoped_refptr<MockTCPClientSocketPool> tcp_socket_pool_; SOCKSSocketParams ignored_socket_params_; + MockNetworkChangeNotifier socks_notifier_; scoped_refptr<SOCKSClientSocketPool> pool_; }; diff --git a/net/socket/tcp_client_socket_pool.cc b/net/socket/tcp_client_socket_pool.cc index db8a88a..a833e01 100644 --- a/net/socket/tcp_client_socket_pool.cc +++ b/net/socket/tcp_client_socket_pool.cc @@ -176,11 +176,13 @@ TCPClientSocketPool::TCPClientSocketPool( int max_sockets_per_group, const std::string& name, HostResolver* host_resolver, - ClientSocketFactory* client_socket_factory) + ClientSocketFactory* client_socket_factory, + NetworkChangeNotifier* network_change_notifier) : base_(max_sockets, max_sockets_per_group, name, base::TimeDelta::FromSeconds(kUnusedIdleSocketTimeout), base::TimeDelta::FromSeconds(kUsedIdleSocketTimeout), - new TCPConnectJobFactory(client_socket_factory, host_resolver)) { + new TCPConnectJobFactory(client_socket_factory, host_resolver), + network_change_notifier) { base_.enable_backup_jobs(); } diff --git a/net/socket/tcp_client_socket_pool.h b/net/socket/tcp_client_socket_pool.h index 463e765..76950c3 100644 --- a/net/socket/tcp_client_socket_pool.h +++ b/net/socket/tcp_client_socket_pool.h @@ -103,7 +103,8 @@ class TCPClientSocketPool : public ClientSocketPool { int max_sockets_per_group, const std::string& name, HostResolver* host_resolver, - ClientSocketFactory* client_socket_factory); + ClientSocketFactory* client_socket_factory, + NetworkChangeNotifier* network_change_notifier); // ClientSocketPool methods: diff --git a/net/socket/tcp_client_socket_pool_unittest.cc b/net/socket/tcp_client_socket_pool_unittest.cc index a41fb88..e7c8a9f 100644 --- a/net/socket/tcp_client_socket_pool_unittest.cc +++ b/net/socket/tcp_client_socket_pool_unittest.cc @@ -8,6 +8,7 @@ #include "base/compiler_specific.h" #include "base/message_loop.h" #include "net/base/mock_host_resolver.h" +#include "net/base/mock_network_change_notifier.h" #include "net/base/net_errors.h" #include "net/base/test_completion_callback.h" #include "net/socket/client_socket.h" @@ -246,7 +247,8 @@ class TCPClientSocketPoolTest : public ClientSocketPoolTest { kMaxSocketsPerGroup, "TCPUnitTest", host_resolver_, - &client_socket_factory_)) { + &client_socket_factory_, + ¬ifier_)) { } int StartRequest(const std::string& group_name, RequestPriority priority) { @@ -257,6 +259,7 @@ class TCPClientSocketPoolTest : public ClientSocketPoolTest { TCPSocketParams ignored_socket_params_; scoped_refptr<MockHostResolver> host_resolver_; MockClientSocketFactory client_socket_factory_; + MockNetworkChangeNotifier notifier_; scoped_refptr<TCPClientSocketPool> pool_; }; @@ -625,6 +628,32 @@ TEST_F(TCPClientSocketPoolTest, FailingActiveRequestWithPendingRequests) { EXPECT_EQ(ERR_CONNECTION_FAILED, requests_[i]->WaitForResult()); } +TEST_F(TCPClientSocketPoolTest, ResetIdleSocketsOnIPAddressChange) { + TestCompletionCallback callback; + ClientSocketHandle handle; + TCPSocketParams dest("www.google.com", 80, LOW, GURL(), false); + int rv = handle.Init("a", dest, LOW, &callback, pool_, NULL); + EXPECT_EQ(ERR_IO_PENDING, rv); + EXPECT_FALSE(handle.is_initialized()); + EXPECT_FALSE(handle.socket()); + + EXPECT_EQ(OK, callback.WaitForResult()); + EXPECT_TRUE(handle.is_initialized()); + EXPECT_TRUE(handle.socket()); + + handle.Reset(); + + // Need to run all pending to release the socket back to the pool. + MessageLoop::current()->RunAllPending(); + + // Now we should have 1 idle socket. + EXPECT_EQ(1, pool_->IdleSocketCount()); + + // After an IP address change, we should have 0 idle sockets. + notifier_.NotifyIPAddressChange(); + EXPECT_EQ(0, pool_->IdleSocketCount()); +} + TEST_F(TCPClientSocketPoolTest, BackupSocketConnect) { // Case 1 tests the first socket stalling, and the backup connecting. MockClientSocketFactory::ClientSocketType case1_types[] = { |