diff options
21 files changed, 908 insertions, 685 deletions
diff --git a/jingle/notifier/base/proxy_resolving_client_socket.cc b/jingle/notifier/base/proxy_resolving_client_socket.cc index cc5bcbe..4c31ba3 100644 --- a/jingle/notifier/base/proxy_resolving_client_socket.cc +++ b/jingle/notifier/base/proxy_resolving_client_socket.cc @@ -165,7 +165,7 @@ void ProxyResolvingClientSocket::ProcessProxyResolveDone(int status) { transport_.reset(new net::ClientSocketHandle); // Now that we have resolved the proxy, we need to connect. - status = net::ClientSocketPoolManager::InitSocketHandleForRawConnect( + status = net::InitSocketHandleForRawConnect( dest_host_port_pair_, network_session_.get(), proxy_info_, diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index a957436..ffdaee5 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc @@ -17,6 +17,7 @@ #include "net/http/url_security_manager.h" #include "net/proxy/proxy_service.h" #include "net/socket/client_socket_factory.h" +#include "net/socket/client_socket_pool_manager_impl.h" #include "net/spdy/spdy_session_pool.h" namespace net { @@ -30,18 +31,20 @@ HttpNetworkSession::HttpNetworkSession(const Params& params) http_auth_handler_factory_(params.http_auth_handler_factory), proxy_service_(params.proxy_service), ssl_config_service_(params.ssl_config_service), - socket_pool_manager_(params.net_log, - params.client_socket_factory ? - params.client_socket_factory : - ClientSocketFactory::GetDefaultFactory(), - params.host_resolver, - params.cert_verifier, - params.origin_bound_cert_service, - params.dnsrr_resolver, - params.dns_cert_checker, - params.ssl_host_info_factory, - params.proxy_service, - params.ssl_config_service), + socket_pool_manager_( + new ClientSocketPoolManagerImpl( + params.net_log, + params.client_socket_factory ? + params.client_socket_factory : + ClientSocketFactory::GetDefaultFactory(), + params.host_resolver, + params.cert_verifier, + params.origin_bound_cert_service, + params.dnsrr_resolver, + params.dns_cert_checker, + params.ssl_host_info_factory, + params.proxy_service, + params.ssl_config_service)), spdy_session_pool_(params.host_resolver, params.ssl_config_service, params.http_server_properties), @@ -70,21 +73,21 @@ void HttpNetworkSession::RemoveResponseDrainer( SOCKSClientSocketPool* HttpNetworkSession::GetSocketPoolForSOCKSProxy( const HostPortPair& socks_proxy) { - return socket_pool_manager_.GetSocketPoolForSOCKSProxy(socks_proxy); + return socket_pool_manager_->GetSocketPoolForSOCKSProxy(socks_proxy); } HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPProxy( const HostPortPair& http_proxy) { - return socket_pool_manager_.GetSocketPoolForHTTPProxy(http_proxy); + return socket_pool_manager_->GetSocketPoolForHTTPProxy(http_proxy); } SSLClientSocketPool* HttpNetworkSession::GetSocketPoolForSSLWithProxy( const HostPortPair& proxy_server) { - return socket_pool_manager_.GetSocketPoolForSSLWithProxy(proxy_server); + return socket_pool_manager_->GetSocketPoolForSSLWithProxy(proxy_server); } Value* HttpNetworkSession::SocketPoolInfoToValue() const { - return socket_pool_manager_.SocketPoolInfoToValue(); + return socket_pool_manager_->SocketPoolInfoToValue(); } Value* HttpNetworkSession::SpdySessionPoolInfoToValue() const { @@ -92,12 +95,12 @@ Value* HttpNetworkSession::SpdySessionPoolInfoToValue() const { } void HttpNetworkSession::CloseAllConnections() { - socket_pool_manager_.FlushSocketPools(); + socket_pool_manager_->FlushSocketPools(); spdy_session_pool_.CloseCurrentSessions(); } void HttpNetworkSession::CloseIdleConnections() { - socket_pool_manager_.CloseIdleSockets(); + socket_pool_manager_->CloseIdleSockets(); spdy_session_pool_.CloseIdleSessions(); } diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index c65b480..a6c6912 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h @@ -37,9 +37,13 @@ class HttpResponseBodyDrainer; class HttpServerProperties; class NetLog; class NetworkDelegate; +class OriginBoundCertService; class ProxyService; +class SOCKSClientSocketPool; +class SSLClientSocketPool; class SSLConfigService; class SSLHostInfoFactory; +class TransportClientSocketPool; // This class holds session objects used by HttpNetworkTransaction objects. class NET_EXPORT HttpNetworkSession @@ -88,12 +92,12 @@ class NET_EXPORT HttpNetworkSession void RemoveResponseDrainer(HttpResponseBodyDrainer* drainer); - TransportClientSocketPool* transport_socket_pool() { - return socket_pool_manager_.transport_socket_pool(); + TransportClientSocketPool* GetTransportSocketPool() { + return socket_pool_manager_->GetTransportSocketPool(); } - SSLClientSocketPool* ssl_socket_pool() { - return socket_pool_manager_.ssl_socket_pool(); + SSLClientSocketPool* GetSSLSocketPool() { + return socket_pool_manager_->GetSSLSocketPool(); } SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy( @@ -154,7 +158,7 @@ class NET_EXPORT HttpNetworkSession HttpAuthCache http_auth_cache_; SSLClientAuthCache ssl_client_auth_cache_; - ClientSocketPoolManager socket_pool_manager_; + scoped_ptr<ClientSocketPoolManager> socket_pool_manager_; SpdySessionPool spdy_session_pool_; scoped_ptr<HttpStreamFactory> http_stream_factory_; std::set<HttpResponseBodyDrainer*> response_drainers_; diff --git a/net/http/http_network_session_peer.cc b/net/http/http_network_session_peer.cc index 921322a..caed612 100644 --- a/net/http/http_network_session_peer.cc +++ b/net/http/http_network_session_peer.cc @@ -19,49 +19,9 @@ HttpNetworkSessionPeer::HttpNetworkSessionPeer( HttpNetworkSessionPeer::~HttpNetworkSessionPeer() {} -void HttpNetworkSessionPeer::SetTransportSocketPool( - TransportClientSocketPool* pool) { - session_->socket_pool_manager_.transport_socket_pool_.reset(pool); -} - -void HttpNetworkSessionPeer::SetSocketPoolForSOCKSProxy( - const HostPortPair& socks_proxy, - SOCKSClientSocketPool* pool) { - ClientSocketPoolManager* socket_pool_manager = - &session_->socket_pool_manager_; - - // Call through the public interface to force initialization of the - // wrapped socket pools. - delete socket_pool_manager->GetSocketPoolForSOCKSProxy(socks_proxy); - socket_pool_manager->socks_socket_pools_[socks_proxy] = pool; -} - -void HttpNetworkSessionPeer::SetSocketPoolForHTTPProxy( - const HostPortPair& http_proxy, - HttpProxyClientSocketPool* pool) { - ClientSocketPoolManager* socket_pool_manager = - &session_->socket_pool_manager_; - - // Call through the public interface to force initialization of the - // wrapped socket pools. - delete socket_pool_manager->GetSocketPoolForHTTPProxy(http_proxy); - socket_pool_manager->http_proxy_socket_pools_[http_proxy] = pool; -} - -void HttpNetworkSessionPeer::SetSSLSocketPool(SSLClientSocketPool* pool) { - session_->socket_pool_manager_.ssl_socket_pool_.reset(pool); -} - -void HttpNetworkSessionPeer::SetSocketPoolForSSLWithProxy( - const HostPortPair& proxy_host, - SSLClientSocketPool* pool) { - ClientSocketPoolManager* socket_pool_manager = - &session_->socket_pool_manager_; - - // Call through the public interface to force initialization of the - // wrapped socket pools. - delete socket_pool_manager->GetSocketPoolForSSLWithProxy(proxy_host); - socket_pool_manager->ssl_socket_pools_for_proxies_[proxy_host] = pool; +void HttpNetworkSessionPeer::SetClientSocketPoolManager( + ClientSocketPoolManager* socket_pool_manager) { + session_->socket_pool_manager_.reset(socket_pool_manager); } void HttpNetworkSessionPeer::SetProxyService(ProxyService* proxy_service) { diff --git a/net/http/http_network_session_peer.h b/net/http/http_network_session_peer.h index d58d560..94234b6 100644 --- a/net/http/http_network_session_peer.h +++ b/net/http/http_network_session_peer.h @@ -11,14 +11,11 @@ namespace net { +class ClientSocketPoolManager; class HostPortPair; class HttpNetworkSession; -class HttpProxyClientSocketPool; class HttpStreamFactory; class ProxyService; -class SOCKSClientSocketPool; -class SSLClientSocketPool; -class TransportClientSocketPool; class NET_EXPORT_PRIVATE HttpNetworkSessionPeer { public: @@ -26,21 +23,8 @@ class NET_EXPORT_PRIVATE HttpNetworkSessionPeer { const scoped_refptr<HttpNetworkSession>& session); ~HttpNetworkSessionPeer(); - void SetTransportSocketPool(TransportClientSocketPool* pool); - - void SetSocketPoolForSOCKSProxy( - const HostPortPair& socks_proxy, - SOCKSClientSocketPool* pool); - - void SetSocketPoolForHTTPProxy( - const HostPortPair& http_proxy, - HttpProxyClientSocketPool* pool); - - void SetSSLSocketPool(SSLClientSocketPool* pool); - - void SetSocketPoolForSSLWithProxy( - const HostPortPair& proxy_host, - SSLClientSocketPool* pool); + void SetClientSocketPoolManager( + ClientSocketPoolManager* socket_pool_manager); void SetProxyService(ProxyService* proxy_service); diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index 1106b1a..bcc83bb 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc @@ -45,6 +45,7 @@ #include "net/proxy/proxy_resolver.h" #include "net/proxy/proxy_service.h" #include "net/socket/client_socket_factory.h" +#include "net/socket/mock_client_socket_pool_manager.h" #include "net/socket/socket_test_util.h" #include "net/socket/ssl_client_socket.h" #include "net/spdy/spdy_framer.h" @@ -3306,11 +3307,11 @@ TEST_F(HttpNetworkTransactionTest, DontRecycleTransportSocketForSSLTunnel) { // We now check to make sure the TCPClientSocket was not added back to // the pool. - EXPECT_EQ(0, session->transport_socket_pool()->IdleSocketCount()); + EXPECT_EQ(0, session->GetTransportSocketPool()->IdleSocketCount()); trans.reset(); MessageLoop::current()->RunAllPending(); // Make sure that the socket didn't get recycled after calling the destructor. - EXPECT_EQ(0, session->transport_socket_pool()->IdleSocketCount()); + EXPECT_EQ(0, session->GetTransportSocketPool()->IdleSocketCount()); } // Make sure that we recycle a socket after reading all of the response body. @@ -3353,7 +3354,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleSocket) { std::string status_line = response->headers->GetStatusLine(); EXPECT_EQ("HTTP/1.1 200 OK", status_line); - EXPECT_EQ(0, session->transport_socket_pool()->IdleSocketCount()); + EXPECT_EQ(0, session->GetTransportSocketPool()->IdleSocketCount()); std::string response_data; rv = ReadTransaction(trans.get(), &response_data); @@ -3365,7 +3366,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleSocket) { MessageLoop::current()->RunAllPending(); // We now check to make sure the socket was added back to the pool. - EXPECT_EQ(1, session->transport_socket_pool()->IdleSocketCount()); + EXPECT_EQ(1, session->GetTransportSocketPool()->IdleSocketCount()); } // Make sure that we recycle a SSL socket after reading all of the response @@ -3412,7 +3413,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleSSLSocket) { ASSERT_TRUE(response->headers != NULL); EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); - EXPECT_EQ(0, session->transport_socket_pool()->IdleSocketCount()); + EXPECT_EQ(0, session->GetTransportSocketPool()->IdleSocketCount()); std::string response_data; rv = ReadTransaction(trans.get(), &response_data); @@ -3424,7 +3425,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleSSLSocket) { MessageLoop::current()->RunAllPending(); // We now check to make sure the socket was added back to the pool. - EXPECT_EQ(1, session->ssl_socket_pool()->IdleSocketCount()); + EXPECT_EQ(1, session->GetSSLSocketPool()->IdleSocketCount()); } // Grab a SSL socket, use it, and put it back into the pool. Then, reuse it @@ -3480,7 +3481,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleDeadSSLSocket) { ASSERT_TRUE(response->headers != NULL); EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); - EXPECT_EQ(0, session->transport_socket_pool()->IdleSocketCount()); + EXPECT_EQ(0, session->GetTransportSocketPool()->IdleSocketCount()); std::string response_data; rv = ReadTransaction(trans.get(), &response_data); @@ -3492,7 +3493,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleDeadSSLSocket) { MessageLoop::current()->RunAllPending(); // We now check to make sure the socket was added back to the pool. - EXPECT_EQ(1, session->ssl_socket_pool()->IdleSocketCount()); + EXPECT_EQ(1, session->GetSSLSocketPool()->IdleSocketCount()); // Now start the second transaction, which should reuse the previous socket. @@ -3508,7 +3509,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleDeadSSLSocket) { ASSERT_TRUE(response->headers != NULL); EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); - EXPECT_EQ(0, session->transport_socket_pool()->IdleSocketCount()); + EXPECT_EQ(0, session->GetTransportSocketPool()->IdleSocketCount()); rv = ReadTransaction(trans.get(), &response_data); EXPECT_EQ(OK, rv); @@ -3519,7 +3520,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleDeadSSLSocket) { MessageLoop::current()->RunAllPending(); // We now check to make sure the socket was added back to the pool. - EXPECT_EQ(1, session->ssl_socket_pool()->IdleSocketCount()); + EXPECT_EQ(1, session->GetSSLSocketPool()->IdleSocketCount()); } // Make sure that we recycle a socket after a zero-length response. @@ -3564,7 +3565,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleSocketAfterZeroContentLength) { std::string status_line = response->headers->GetStatusLine(); EXPECT_EQ("HTTP/1.1 204 No Content", status_line); - EXPECT_EQ(0, session->transport_socket_pool()->IdleSocketCount()); + EXPECT_EQ(0, session->GetTransportSocketPool()->IdleSocketCount()); std::string response_data; rv = ReadTransaction(trans.get(), &response_data); @@ -3576,7 +3577,7 @@ TEST_F(HttpNetworkTransactionTest, RecycleSocketAfterZeroContentLength) { MessageLoop::current()->RunAllPending(); // We now check to make sure the socket was added back to the pool. - EXPECT_EQ(1, session->transport_socket_pool()->IdleSocketCount()); + EXPECT_EQ(1, session->GetTransportSocketPool()->IdleSocketCount()); } TEST_F(HttpNetworkTransactionTest, ResendRequestOnWriteBodyError) { @@ -5626,10 +5627,13 @@ TEST_F(HttpNetworkTransactionTest, GroupNameForDirectConnections) { HttpNetworkSessionPeer peer(session); CaptureGroupNameTransportSocketPool* transport_conn_pool = new CaptureGroupNameTransportSocketPool(NULL, NULL); - peer.SetTransportSocketPool(transport_conn_pool); CaptureGroupNameSSLSocketPool* ssl_conn_pool = new CaptureGroupNameSSLSocketPool(NULL, NULL); - peer.SetSSLSocketPool(ssl_conn_pool); + MockClientSocketPoolManager* mock_pool_manager = + new MockClientSocketPoolManager; + mock_pool_manager->SetTransportSocketPool(transport_conn_pool); + mock_pool_manager->SetSSLSocketPool(ssl_conn_pool); + peer.SetClientSocketPoolManager(mock_pool_manager); EXPECT_EQ(ERR_IO_PENDING, GroupNameTransactionHelper(tests[i].url, session)); @@ -5682,10 +5686,14 @@ TEST_F(HttpNetworkTransactionTest, GroupNameForHTTPProxyConnections) { HostPortPair proxy_host("http_proxy", 80); CaptureGroupNameHttpProxySocketPool* http_proxy_pool = new CaptureGroupNameHttpProxySocketPool(NULL, NULL); - peer.SetSocketPoolForHTTPProxy(proxy_host, http_proxy_pool); CaptureGroupNameSSLSocketPool* ssl_conn_pool = new CaptureGroupNameSSLSocketPool(NULL, NULL); - peer.SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); + + MockClientSocketPoolManager* mock_pool_manager = + new MockClientSocketPoolManager; + mock_pool_manager->SetSocketPoolForHTTPProxy(proxy_host, http_proxy_pool); + mock_pool_manager->SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); + peer.SetClientSocketPoolManager(mock_pool_manager); EXPECT_EQ(ERR_IO_PENDING, GroupNameTransactionHelper(tests[i].url, session)); @@ -5750,10 +5758,14 @@ TEST_F(HttpNetworkTransactionTest, GroupNameForSOCKSConnections) { HostPortPair proxy_host("socks_proxy", 1080); CaptureGroupNameSOCKSSocketPool* socks_conn_pool = new CaptureGroupNameSOCKSSocketPool(NULL, NULL); - peer.SetSocketPoolForSOCKSProxy(proxy_host, socks_conn_pool); CaptureGroupNameSSLSocketPool* ssl_conn_pool = new CaptureGroupNameSSLSocketPool(NULL, NULL); - peer.SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); + + MockClientSocketPoolManager* mock_pool_manager = + new MockClientSocketPoolManager; + mock_pool_manager->SetSocketPoolForSOCKSProxy(proxy_host, socks_conn_pool); + mock_pool_manager->SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); + peer.SetClientSocketPoolManager(mock_pool_manager); scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); @@ -7270,7 +7282,7 @@ TEST_F(HttpNetworkTransactionTest, transport_params, LOWEST, &callback, - session->transport_socket_pool(), + session->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); @@ -7762,7 +7774,10 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) { session_deps.host_resolver.get(), &session_deps.socket_factory, session_deps.net_log); - session_peer.SetTransportSocketPool(transport_pool); + MockClientSocketPoolManager* mock_pool_manager = + new MockClientSocketPoolManager; + mock_pool_manager->SetTransportSocketPool(transport_pool); + session_peer.SetClientSocketPoolManager(mock_pool_manager); scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); TestOldCompletionCallback callback; @@ -8525,7 +8540,7 @@ TEST_F(HttpNetworkTransactionTest, PreconnectWithExistingSpdySession) { EXPECT_EQ(ERR_IO_PENDING, connection->Init(host_port_pair.ToString(), transport_params, LOWEST, &callback, - session->transport_socket_pool(), BoundNetLog())); + session->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); spdy_session->InitializeWithSocket(connection.release(), false, OK); diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc index 46bc3f4..6fb88dc 100644 --- a/net/http/http_stream_factory_impl_job.cc +++ b/net/http/http_stream_factory_impl_job.cc @@ -651,7 +651,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() { } if (IsPreconnecting()) { - return ClientSocketPoolManager::PreconnectSocketsForHttpRequest( + return PreconnectSocketsForHttpRequest( origin_url_, request_info_.extra_headers, request_info_.load_flags, @@ -665,7 +665,7 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() { net_log_, num_streams_); } else { - return ClientSocketPoolManager::InitSocketHandleForHttpRequest( + return InitSocketHandleForHttpRequest( origin_url_, request_info_.extra_headers, request_info_.load_flags, diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc index 818049f..3b47b1d 100644 --- a/net/http/http_stream_factory_impl_unittest.cc +++ b/net/http/http_stream_factory_impl_unittest.cc @@ -21,6 +21,7 @@ #include "net/http/http_stream.h" #include "net/proxy/proxy_info.h" #include "net/proxy/proxy_service.h" +#include "net/socket/mock_client_socket_pool_manager.h" #include "net/socket/socket_test_util.h" #include "net/spdy/spdy_session.h" #include "net/spdy/spdy_session_pool.h" @@ -281,12 +282,15 @@ TEST(HttpStreamFactoryTest, PreconnectDirect) { new CapturePreconnectsTransportSocketPool( session_deps.host_resolver.get(), session_deps.cert_verifier.get()); - peer.SetTransportSocketPool(transport_conn_pool); CapturePreconnectsSSLSocketPool* ssl_conn_pool = new CapturePreconnectsSSLSocketPool( session_deps.host_resolver.get(), session_deps.cert_verifier.get()); - peer.SetSSLSocketPool(ssl_conn_pool); + MockClientSocketPoolManager* mock_pool_manager = + new MockClientSocketPoolManager; + mock_pool_manager->SetTransportSocketPool(transport_conn_pool); + mock_pool_manager->SetSSLSocketPool(ssl_conn_pool); + peer.SetClientSocketPoolManager(mock_pool_manager); PreconnectHelper(kTests[i], session); if (kTests[i].ssl) EXPECT_EQ(kTests[i].num_streams, ssl_conn_pool->last_num_streams()); @@ -305,12 +309,15 @@ TEST(HttpStreamFactoryTest, PreconnectHttpProxy) { new CapturePreconnectsHttpProxySocketPool( session_deps.host_resolver.get(), session_deps.cert_verifier.get()); - peer.SetSocketPoolForHTTPProxy(proxy_host, http_proxy_pool); CapturePreconnectsSSLSocketPool* ssl_conn_pool = new CapturePreconnectsSSLSocketPool( session_deps.host_resolver.get(), session_deps.cert_verifier.get()); - peer.SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); + MockClientSocketPoolManager* mock_pool_manager = + new MockClientSocketPoolManager; + mock_pool_manager->SetSocketPoolForHTTPProxy(proxy_host, http_proxy_pool); + mock_pool_manager->SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); + peer.SetClientSocketPoolManager(mock_pool_manager); PreconnectHelper(kTests[i], session); if (kTests[i].ssl) EXPECT_EQ(kTests[i].num_streams, ssl_conn_pool->last_num_streams()); @@ -330,12 +337,15 @@ TEST(HttpStreamFactoryTest, PreconnectSocksProxy) { new CapturePreconnectsSOCKSSocketPool( session_deps.host_resolver.get(), session_deps.cert_verifier.get()); - peer.SetSocketPoolForSOCKSProxy(proxy_host, socks_proxy_pool); CapturePreconnectsSSLSocketPool* ssl_conn_pool = new CapturePreconnectsSSLSocketPool( session_deps.host_resolver.get(), session_deps.cert_verifier.get()); - peer.SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); + MockClientSocketPoolManager* mock_pool_manager = + new MockClientSocketPoolManager; + mock_pool_manager->SetSocketPoolForSOCKSProxy(proxy_host, socks_proxy_pool); + mock_pool_manager->SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); + peer.SetClientSocketPoolManager(mock_pool_manager); PreconnectHelper(kTests[i], session); if (kTests[i].ssl) EXPECT_EQ(kTests[i].num_streams, ssl_conn_pool->last_num_streams()); @@ -360,12 +370,15 @@ TEST(HttpStreamFactoryTest, PreconnectDirectWithExistingSpdySession) { new CapturePreconnectsTransportSocketPool( session_deps.host_resolver.get(), session_deps.cert_verifier.get()); - peer.SetTransportSocketPool(transport_conn_pool); CapturePreconnectsSSLSocketPool* ssl_conn_pool = new CapturePreconnectsSSLSocketPool( session_deps.host_resolver.get(), session_deps.cert_verifier.get()); - peer.SetSSLSocketPool(ssl_conn_pool); + MockClientSocketPoolManager* mock_pool_manager = + new MockClientSocketPoolManager; + mock_pool_manager->SetTransportSocketPool(transport_conn_pool); + mock_pool_manager->SetSSLSocketPool(ssl_conn_pool); + peer.SetClientSocketPoolManager(mock_pool_manager); PreconnectHelper(kTests[i], session); // We shouldn't be preconnecting if we have an existing session, which is // the case for https://www.google.com. diff --git a/net/net.gyp b/net/net.gyp index 8f204ef..a81d467 100644 --- a/net/net.gyp +++ b/net/net.gyp @@ -553,6 +553,8 @@ 'socket/client_socket_pool_histograms.h', 'socket/client_socket_pool_manager.cc', 'socket/client_socket_pool_manager.h', + 'socket/client_socket_pool_manager_impl.cc', + 'socket/client_socket_pool_manager_impl.h', 'socket/dns_cert_provenance_checker.cc', 'socket/dns_cert_provenance_checker.h', 'socket/nss_ssl_util.cc', @@ -1106,6 +1108,8 @@ 'proxy/sync_host_resolver_bridge_unittest.cc', 'socket/client_socket_pool_base_unittest.cc', 'socket/deterministic_socket_data_unittest.cc', + 'socket/mock_client_socket_pool_manager.cc', + 'socket/mock_client_socket_pool_manager.h', 'socket/socks5_client_socket_unittest.cc', 'socket/socks_client_socket_pool_unittest.cc', 'socket/socks_client_socket_unittest.cc', diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc index b47c3e5..219747d 100644 --- a/net/socket/client_socket_pool_manager.cc +++ b/net/socket/client_socket_pool_manager.cc @@ -1,10 +1,6 @@ // Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// -// ClientSocketPoolManager manages access to all ClientSocketPools. It's a -// simple container for all of them. Most importantly, it handles the lifetime -// and destruction order properly. #include "net/socket/client_socket_pool_manager.h" @@ -12,15 +8,12 @@ #include "base/logging.h" #include "base/stringprintf.h" -#include "base/values.h" -#include "net/base/ssl_config_service.h" +#include "net/base/load_flags.h" #include "net/http/http_network_session.h" #include "net/http/http_proxy_client_socket_pool.h" #include "net/http/http_request_info.h" -#include "net/proxy/proxy_service.h" -#include "net/socket/client_socket_factory.h" +#include "net/proxy/proxy_info.h" #include "net/socket/client_socket_handle.h" -#include "net/socket/client_socket_pool_histograms.h" #include "net/socket/socks_client_socket_pool.h" #include "net/socket/ssl_client_socket_pool.h" #include "net/socket/transport_client_socket_pool.h" @@ -42,20 +35,6 @@ int g_max_sockets_per_group = 6; // http://crbug.com/44501 for details about proxy server connection limits. int g_max_sockets_per_proxy_server = kDefaultMaxSocketsPerProxyServer; -// Appends information about all |socket_pools| to the end of |list|. -template <class MapType> -static void AddSocketPoolsToList(ListValue* list, - const MapType& socket_pools, - const std::string& type, - bool include_nested_pools) { - for (typename MapType::const_iterator it = socket_pools.begin(); - it != socket_pools.end(); it++) { - list->Append(it->second->GetInfoAsValue(it->first.ToString(), - type, - include_nested_pools)); - } -} - // The meat of the implementation for the InitSocketHandleForHttpRequest, // InitSocketHandleForRawConnect and PreconnectSocketsForHttpRequest methods. int InitSocketPoolHelper(const GURL& request_url, @@ -182,7 +161,7 @@ int InitSocketPoolHelper(const GURL& request_url, want_spdy_over_npn); SSLClientSocketPool* ssl_pool = NULL; if (proxy_info.is_direct()) - ssl_pool = session->ssl_socket_pool(); + ssl_pool = session->GetSSLSocketPool(); else ssl_pool = session->GetSocketPoolForSSLWithProxy(*proxy_host_port); @@ -228,7 +207,7 @@ int InitSocketPoolHelper(const GURL& request_url, DCHECK(proxy_info.is_direct()); - TransportClientSocketPool* pool = session->transport_socket_pool(); + TransportClientSocketPool* pool = session->GetTransportSocketPool(); if (num_preconnect_streams) { RequestSocketsForPool(pool, connection_group, tcp_params, num_preconnect_streams, net_log); @@ -242,299 +221,12 @@ int InitSocketPoolHelper(const GURL& request_url, } // namespace -ClientSocketPoolManager::ClientSocketPoolManager( - NetLog* net_log, - ClientSocketFactory* socket_factory, - HostResolver* host_resolver, - CertVerifier* cert_verifier, - OriginBoundCertService* origin_bound_cert_service, - DnsRRResolver* dnsrr_resolver, - DnsCertProvenanceChecker* dns_cert_checker, - SSLHostInfoFactory* ssl_host_info_factory, - ProxyService* proxy_service, - SSLConfigService* ssl_config_service) - : net_log_(net_log), - socket_factory_(socket_factory), - host_resolver_(host_resolver), - cert_verifier_(cert_verifier), - origin_bound_cert_service_(origin_bound_cert_service), - dnsrr_resolver_(dnsrr_resolver), - dns_cert_checker_(dns_cert_checker), - ssl_host_info_factory_(ssl_host_info_factory), - proxy_service_(proxy_service), - ssl_config_service_(ssl_config_service), - transport_pool_histograms_("TCP"), - transport_socket_pool_(new TransportClientSocketPool( - g_max_sockets_per_pool, g_max_sockets_per_group, - &transport_pool_histograms_, - host_resolver, - socket_factory_, - net_log)), - ssl_pool_histograms_("SSL2"), - ssl_socket_pool_(new SSLClientSocketPool( - g_max_sockets_per_pool, g_max_sockets_per_group, - &ssl_pool_histograms_, - host_resolver, - cert_verifier, - origin_bound_cert_service, - dnsrr_resolver, - dns_cert_checker, - ssl_host_info_factory, - socket_factory, - transport_socket_pool_.get(), - NULL /* no socks proxy */, - NULL /* no http proxy */, - ssl_config_service, - net_log)), - transport_for_socks_pool_histograms_("TCPforSOCKS"), - socks_pool_histograms_("SOCK"), - transport_for_http_proxy_pool_histograms_("TCPforHTTPProxy"), - transport_for_https_proxy_pool_histograms_("TCPforHTTPSProxy"), - ssl_for_https_proxy_pool_histograms_("SSLforHTTPSProxy"), - http_proxy_pool_histograms_("HTTPProxy"), - ssl_socket_pool_for_proxies_histograms_("SSLForProxies") { - CertDatabase::AddObserver(this); -} - -ClientSocketPoolManager::~ClientSocketPoolManager() { - CertDatabase::RemoveObserver(this); -} - -void ClientSocketPoolManager::FlushSocketPools() { - // Flush the highest level pools first, since higher level pools may release - // stuff to the lower level pools. - - for (SSLSocketPoolMap::const_iterator it = - ssl_socket_pools_for_proxies_.begin(); - it != ssl_socket_pools_for_proxies_.end(); - ++it) - it->second->Flush(); - - for (HTTPProxySocketPoolMap::const_iterator it = - http_proxy_socket_pools_.begin(); - it != http_proxy_socket_pools_.end(); - ++it) - it->second->Flush(); - - for (SSLSocketPoolMap::const_iterator it = - ssl_socket_pools_for_https_proxies_.begin(); - it != ssl_socket_pools_for_https_proxies_.end(); - ++it) - it->second->Flush(); - - for (TransportSocketPoolMap::const_iterator it = - transport_socket_pools_for_https_proxies_.begin(); - it != transport_socket_pools_for_https_proxies_.end(); - ++it) - it->second->Flush(); - - for (TransportSocketPoolMap::const_iterator it = - transport_socket_pools_for_http_proxies_.begin(); - it != transport_socket_pools_for_http_proxies_.end(); - ++it) - it->second->Flush(); - - for (SOCKSSocketPoolMap::const_iterator it = - socks_socket_pools_.begin(); - it != socks_socket_pools_.end(); - ++it) - it->second->Flush(); - - for (TransportSocketPoolMap::const_iterator it = - transport_socket_pools_for_socks_proxies_.begin(); - it != transport_socket_pools_for_socks_proxies_.end(); - ++it) - it->second->Flush(); - - ssl_socket_pool_->Flush(); - transport_socket_pool_->Flush(); -} - -void ClientSocketPoolManager::CloseIdleSockets() { - // Close sockets in the highest level pools first, since higher level pools' - // sockets may release stuff to the lower level pools. - for (SSLSocketPoolMap::const_iterator it = - ssl_socket_pools_for_proxies_.begin(); - it != ssl_socket_pools_for_proxies_.end(); - ++it) - it->second->CloseIdleSockets(); - - for (HTTPProxySocketPoolMap::const_iterator it = - http_proxy_socket_pools_.begin(); - it != http_proxy_socket_pools_.end(); - ++it) - it->second->CloseIdleSockets(); - - for (SSLSocketPoolMap::const_iterator it = - ssl_socket_pools_for_https_proxies_.begin(); - it != ssl_socket_pools_for_https_proxies_.end(); - ++it) - it->second->CloseIdleSockets(); - - for (TransportSocketPoolMap::const_iterator it = - transport_socket_pools_for_https_proxies_.begin(); - it != transport_socket_pools_for_https_proxies_.end(); - ++it) - it->second->CloseIdleSockets(); - - for (TransportSocketPoolMap::const_iterator it = - transport_socket_pools_for_http_proxies_.begin(); - it != transport_socket_pools_for_http_proxies_.end(); - ++it) - it->second->CloseIdleSockets(); - - for (SOCKSSocketPoolMap::const_iterator it = - socks_socket_pools_.begin(); - it != socks_socket_pools_.end(); - ++it) - it->second->CloseIdleSockets(); - - for (TransportSocketPoolMap::const_iterator it = - transport_socket_pools_for_socks_proxies_.begin(); - it != transport_socket_pools_for_socks_proxies_.end(); - ++it) - it->second->CloseIdleSockets(); - - ssl_socket_pool_->CloseIdleSockets(); - transport_socket_pool_->CloseIdleSockets(); -} - -SOCKSClientSocketPool* ClientSocketPoolManager::GetSocketPoolForSOCKSProxy( - const HostPortPair& socks_proxy) { - SOCKSSocketPoolMap::const_iterator it = socks_socket_pools_.find(socks_proxy); - if (it != socks_socket_pools_.end()) { - DCHECK(ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); - return it->second; - } - - DCHECK(!ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); - - std::pair<TransportSocketPoolMap::iterator, bool> tcp_ret = - transport_socket_pools_for_socks_proxies_.insert( - std::make_pair( - socks_proxy, - new TransportClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - &transport_for_socks_pool_histograms_, - host_resolver_, - socket_factory_, - net_log_))); - DCHECK(tcp_ret.second); - - std::pair<SOCKSSocketPoolMap::iterator, bool> ret = - socks_socket_pools_.insert( - std::make_pair(socks_proxy, new SOCKSClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - &socks_pool_histograms_, - host_resolver_, - tcp_ret.first->second, - net_log_))); - - return ret.first->second; -} - -HttpProxyClientSocketPool* ClientSocketPoolManager::GetSocketPoolForHTTPProxy( - const HostPortPair& http_proxy) { - HTTPProxySocketPoolMap::const_iterator it = - http_proxy_socket_pools_.find(http_proxy); - if (it != http_proxy_socket_pools_.end()) { - DCHECK(ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); - DCHECK(ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); - DCHECK(ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); - return it->second; - } - - DCHECK(!ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); - DCHECK(!ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); - DCHECK(!ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); - - std::pair<TransportSocketPoolMap::iterator, bool> tcp_http_ret = - transport_socket_pools_for_http_proxies_.insert( - std::make_pair( - http_proxy, - new TransportClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - &transport_for_http_proxy_pool_histograms_, - host_resolver_, - socket_factory_, - net_log_))); - DCHECK(tcp_http_ret.second); - - std::pair<TransportSocketPoolMap::iterator, bool> tcp_https_ret = - transport_socket_pools_for_https_proxies_.insert( - std::make_pair( - http_proxy, - new TransportClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - &transport_for_https_proxy_pool_histograms_, - host_resolver_, - socket_factory_, - net_log_))); - DCHECK(tcp_https_ret.second); - - std::pair<SSLSocketPoolMap::iterator, bool> ssl_https_ret = - ssl_socket_pools_for_https_proxies_.insert( - std::make_pair( - http_proxy, - new SSLClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - &ssl_for_https_proxy_pool_histograms_, - host_resolver_, - cert_verifier_, - origin_bound_cert_service_, - dnsrr_resolver_, - dns_cert_checker_, - ssl_host_info_factory_, - socket_factory_, - tcp_https_ret.first->second /* https proxy */, - NULL /* no socks proxy */, - NULL /* no http proxy */, - ssl_config_service_, net_log_))); - DCHECK(tcp_https_ret.second); - - std::pair<HTTPProxySocketPoolMap::iterator, bool> ret = - http_proxy_socket_pools_.insert( - std::make_pair( - http_proxy, - new HttpProxyClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - &http_proxy_pool_histograms_, - host_resolver_, - tcp_http_ret.first->second, - ssl_https_ret.first->second, - net_log_))); - - return ret.first->second; -} +ClientSocketPoolManager::ClientSocketPoolManager() {} +ClientSocketPoolManager::~ClientSocketPoolManager() {} -SSLClientSocketPool* ClientSocketPoolManager::GetSocketPoolForSSLWithProxy( - const HostPortPair& proxy_server) { - SSLSocketPoolMap::const_iterator it = - ssl_socket_pools_for_proxies_.find(proxy_server); - if (it != ssl_socket_pools_for_proxies_.end()) - return it->second; - - SSLClientSocketPool* new_pool = new SSLClientSocketPool( - g_max_sockets_per_proxy_server, g_max_sockets_per_group, - &ssl_pool_histograms_, - host_resolver_, - cert_verifier_, - origin_bound_cert_service_, - dnsrr_resolver_, - dns_cert_checker_, - ssl_host_info_factory_, - socket_factory_, - NULL, /* no tcp pool, we always go through a proxy */ - GetSocketPoolForSOCKSProxy(proxy_server), - GetSocketPoolForHTTPProxy(proxy_server), - ssl_config_service_, - net_log_); - - std::pair<SSLSocketPoolMap::iterator, bool> ret = - ssl_socket_pools_for_proxies_.insert(std::make_pair(proxy_server, - new_pool)); - - return ret.first->second; +// static +int ClientSocketPoolManager::max_sockets_per_pool() { + return g_max_sockets_per_pool; } // static @@ -562,6 +254,11 @@ void ClientSocketPoolManager::set_max_sockets_per_group(int socket_count) { } // static +int ClientSocketPoolManager::max_sockets_per_proxy_server() { + return g_max_sockets_per_proxy_server; +} + +// static void ClientSocketPoolManager::set_max_sockets_per_proxy_server( int socket_count) { DCHECK_LT(0, socket_count); @@ -572,55 +269,7 @@ void ClientSocketPoolManager::set_max_sockets_per_proxy_server( g_max_sockets_per_proxy_server = socket_count; } -Value* ClientSocketPoolManager::SocketPoolInfoToValue() const { - ListValue* list = new ListValue(); - list->Append(transport_socket_pool_->GetInfoAsValue("transport_socket_pool", - "transport_socket_pool", - false)); - // Third parameter is false because |ssl_socket_pool_| uses - // |transport_socket_pool_| internally, and do not want to add it a second - // time. - list->Append(ssl_socket_pool_->GetInfoAsValue("ssl_socket_pool", - "ssl_socket_pool", - false)); - AddSocketPoolsToList(list, - http_proxy_socket_pools_, - "http_proxy_socket_pool", - true); - AddSocketPoolsToList(list, - socks_socket_pools_, - "socks_socket_pool", - true); - - // Third parameter is false because |ssl_socket_pools_for_proxies_| use - // socket pools in |http_proxy_socket_pools_| and |socks_socket_pools_|. - AddSocketPoolsToList(list, - ssl_socket_pools_for_proxies_, - "ssl_socket_pool_for_proxies", - false); - return list; -} - -void ClientSocketPoolManager::OnUserCertAdded(const X509Certificate* cert) { - FlushSocketPools(); -} - -void ClientSocketPoolManager::OnCertTrustChanged(const X509Certificate* cert) { - // We should flush the socket pools if we removed trust from a - // cert, because a previously trusted server may have become - // untrusted. - // - // We should not flush the socket pools if we added trust to a - // cert. - // - // Since the OnCertTrustChanged method doesn't tell us what - // kind of trust change it is, we have to flush the socket - // pools to be safe. - FlushSocketPools(); -} - -// static -int ClientSocketPoolManager::InitSocketHandleForHttpRequest( +int InitSocketHandleForHttpRequest( const GURL& request_url, const HttpRequestHeaders& request_extra_headers, int request_load_flags, @@ -652,8 +301,7 @@ int ClientSocketPoolManager::InitSocketHandleForHttpRequest( callback); } -// static -int ClientSocketPoolManager::InitSocketHandleForRawConnect( +int InitSocketHandleForRawConnect( const HostPortPair& host_port_pair, HttpNetworkSession* session, const ProxyInfo& proxy_info, @@ -686,8 +334,7 @@ int ClientSocketPoolManager::InitSocketHandleForRawConnect( callback); } -// static -int ClientSocketPoolManager::PreconnectSocketsForHttpRequest( +int PreconnectSocketsForHttpRequest( const GURL& request_url, const HttpRequestHeaders& request_extra_headers, int request_load_flags, @@ -717,5 +364,4 @@ int ClientSocketPoolManager::PreconnectSocketsForHttpRequest( NULL); } - } // namespace net diff --git a/net/socket/client_socket_pool_manager.h b/net/socket/client_socket_pool_manager.h index 1b81781..2c51761 100644 --- a/net/socket/client_socket_pool_manager.h +++ b/net/socket/client_socket_pool_manager.h @@ -10,18 +10,9 @@ #define NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_ #pragma once -#include <map> -#include "base/basictypes.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/stl_util.h" -#include "base/template_util.h" -#include "base/threading/non_thread_safe.h" -#include "net/base/cert_database.h" #include "net/base/completion_callback.h" #include "net/base/net_export.h" #include "net/base/request_priority.h" -#include "net/socket/client_socket_pool_histograms.h" class GURL; @@ -32,26 +23,15 @@ class Value; namespace net { class BoundNetLog; -class CertVerifier; -class ClientSocketFactory; class ClientSocketHandle; -class ClientSocketPoolHistograms; -class DnsCertProvenanceChecker; -class DnsRRResolver; -class HttpNetworkSession; -class HttpRequestHeaders; class HostPortPair; +class HttpNetworkSession; class HttpProxyClientSocketPool; -class HostResolver; -class NetLog; -class OriginBoundCertService; +class HttpRequestHeaders; class ProxyInfo; -class ProxyService; +class TransportClientSocketPool; class SOCKSClientSocketPool; class SSLClientSocketPool; -class SSLConfigService; -class SSLHostInfoFactory; -class TransportClientSocketPool; struct SSLConfig; @@ -59,177 +39,87 @@ struct SSLConfig; // really offer much flexiblity in exporting contants. enum DefaultMaxValues { kDefaultMaxSocketsPerProxyServer = 32 }; -namespace internal { - -// A helper class for auto-deleting Values in the destructor. -template <typename Key, typename Value> -class OwnedPoolMap : public std::map<Key, Value> { +class NET_EXPORT_PRIVATE ClientSocketPoolManager { public: - OwnedPoolMap() { - COMPILE_ASSERT(base::is_pointer<Value>::value, - value_must_be_a_pointer); - } - - ~OwnedPoolMap() { - STLDeleteValues(this); - } -}; - -} // namespace internal - -class ClientSocketPoolManager : public base::NonThreadSafe, - public CertDatabase::Observer { - public: - ClientSocketPoolManager(NetLog* net_log, - ClientSocketFactory* socket_factory, - HostResolver* host_resolver, - CertVerifier* cert_verifier, - OriginBoundCertService* origin_bound_cert_service, - DnsRRResolver* dnsrr_resolver, - DnsCertProvenanceChecker* dns_cert_checker, - SSLHostInfoFactory* ssl_host_info_factory, - ProxyService* proxy_service, - SSLConfigService* ssl_config_service); + ClientSocketPoolManager(); virtual ~ClientSocketPoolManager(); - void FlushSocketPools(); - void CloseIdleSockets(); - - TransportClientSocketPool* transport_socket_pool() { - return transport_socket_pool_.get(); - } - - SSLClientSocketPool* ssl_socket_pool() { return ssl_socket_pool_.get(); } - - SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy( - const HostPortPair& socks_proxy); - - HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy( - const HostPortPair& http_proxy); - - SSLClientSocketPool* GetSocketPoolForSSLWithProxy( - const HostPortPair& proxy_server); - // The setter methods below affect only newly created socket pools after the // methods are called. Normally they should be called at program startup - // before any ClientSocketPoolManager is created. - NET_EXPORT static void set_max_sockets_per_pool(int socket_count); - NET_EXPORT static int max_sockets_per_group(); - NET_EXPORT static void set_max_sockets_per_group(int socket_count); - NET_EXPORT static void set_max_sockets_per_proxy_server(int socket_count); - - // A helper method that uses the passed in proxy information to initialize a - // ClientSocketHandle with the relevant socket pool. Use this method for - // HTTP/HTTPS requests. |ssl_config_for_origin| is only used if the request - // uses SSL and |ssl_config_for_proxy| is used if the proxy server is HTTPS. - static int InitSocketHandleForHttpRequest( - const GURL& request_url, - const HttpRequestHeaders& request_extra_headers, - int request_load_flags, - RequestPriority request_priority, - HttpNetworkSession* session, - const ProxyInfo& proxy_info, - bool force_spdy_over_ssl, - bool want_spdy_over_npn, - const SSLConfig& ssl_config_for_origin, - const SSLConfig& ssl_config_for_proxy, - const BoundNetLog& net_log, - ClientSocketHandle* socket_handle, - OldCompletionCallback* callback); - - // A helper method that uses the passed in proxy information to initialize a - // ClientSocketHandle with the relevant socket pool. Use this method for - // a raw socket connection to a host-port pair (that needs to tunnel through - // the proxies). - NET_EXPORT static int InitSocketHandleForRawConnect( - const HostPortPair& host_port_pair, - HttpNetworkSession* session, - const ProxyInfo& proxy_info, - const SSLConfig& ssl_config_for_origin, - const SSLConfig& ssl_config_for_proxy, - const BoundNetLog& net_log, - ClientSocketHandle* socket_handle, - OldCompletionCallback* callback); - - // Similar to InitSocketHandleForHttpRequest except that it initiates the - // desired number of preconnect streams from the relevant socket pool. - static int PreconnectSocketsForHttpRequest( - const GURL& request_url, - const HttpRequestHeaders& request_extra_headers, - int request_load_flags, - RequestPriority request_priority, - HttpNetworkSession* session, - const ProxyInfo& proxy_info, - bool force_spdy_over_ssl, - bool want_spdy_over_npn, - const SSLConfig& ssl_config_for_origin, - const SSLConfig& ssl_config_for_proxy, - const BoundNetLog& net_log, - int num_preconnect_streams); - + // before any ClientSocketPoolManagerImpl is created. + static int max_sockets_per_pool(); + static void set_max_sockets_per_pool(int socket_count); + + static int max_sockets_per_group(); + static void set_max_sockets_per_group(int socket_count); + + static int max_sockets_per_proxy_server(); + static void set_max_sockets_per_proxy_server(int socket_count); + + virtual void FlushSocketPools() = 0; + virtual void CloseIdleSockets() = 0; + virtual TransportClientSocketPool* GetTransportSocketPool() = 0; + virtual SSLClientSocketPool* GetSSLSocketPool() = 0; + virtual SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy( + const HostPortPair& socks_proxy) = 0; + virtual HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy( + const HostPortPair& http_proxy) = 0; + virtual SSLClientSocketPool* GetSocketPoolForSSLWithProxy( + const HostPortPair& proxy_server) = 0; // Creates a Value summary of the state of the socket pools. The caller is // responsible for deleting the returned value. - base::Value* SocketPoolInfoToValue() const; - - // CertDatabase::Observer methods: - virtual void OnUserCertAdded(const X509Certificate* cert) OVERRIDE; - virtual void OnCertTrustChanged(const X509Certificate* cert) OVERRIDE; - - private: - friend class HttpNetworkSessionPeer; - - typedef internal::OwnedPoolMap<HostPortPair, TransportClientSocketPool*> - TransportSocketPoolMap; - typedef internal::OwnedPoolMap<HostPortPair, SOCKSClientSocketPool*> - SOCKSSocketPoolMap; - typedef internal::OwnedPoolMap<HostPortPair, HttpProxyClientSocketPool*> - HTTPProxySocketPoolMap; - typedef internal::OwnedPoolMap<HostPortPair, SSLClientSocketPool*> - SSLSocketPoolMap; - - NetLog* const net_log_; - ClientSocketFactory* const socket_factory_; - HostResolver* const host_resolver_; - CertVerifier* const cert_verifier_; - OriginBoundCertService* const origin_bound_cert_service_; - DnsRRResolver* const dnsrr_resolver_; - DnsCertProvenanceChecker* const dns_cert_checker_; - SSLHostInfoFactory* const ssl_host_info_factory_; - ProxyService* const proxy_service_; - const scoped_refptr<SSLConfigService> ssl_config_service_; - - // Note: this ordering is important. - - ClientSocketPoolHistograms transport_pool_histograms_; - scoped_ptr<TransportClientSocketPool> transport_socket_pool_; - - ClientSocketPoolHistograms ssl_pool_histograms_; - scoped_ptr<SSLClientSocketPool> ssl_socket_pool_; - - ClientSocketPoolHistograms transport_for_socks_pool_histograms_; - TransportSocketPoolMap transport_socket_pools_for_socks_proxies_; - - ClientSocketPoolHistograms socks_pool_histograms_; - SOCKSSocketPoolMap socks_socket_pools_; - - ClientSocketPoolHistograms transport_for_http_proxy_pool_histograms_; - TransportSocketPoolMap transport_socket_pools_for_http_proxies_; - - ClientSocketPoolHistograms transport_for_https_proxy_pool_histograms_; - TransportSocketPoolMap transport_socket_pools_for_https_proxies_; - - ClientSocketPoolHistograms ssl_for_https_proxy_pool_histograms_; - SSLSocketPoolMap ssl_socket_pools_for_https_proxies_; - - ClientSocketPoolHistograms http_proxy_pool_histograms_; - HTTPProxySocketPoolMap http_proxy_socket_pools_; - - ClientSocketPoolHistograms ssl_socket_pool_for_proxies_histograms_; - SSLSocketPoolMap ssl_socket_pools_for_proxies_; - - DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolManager); + virtual base::Value* SocketPoolInfoToValue() const = 0; }; +// A helper method that uses the passed in proxy information to initialize a +// ClientSocketHandle with the relevant socket pool. Use this method for +// HTTP/HTTPS requests. |ssl_config_for_origin| is only used if the request +// uses SSL and |ssl_config_for_proxy| is used if the proxy server is HTTPS. +int InitSocketHandleForHttpRequest( + const GURL& request_url, + const HttpRequestHeaders& request_extra_headers, + int request_load_flags, + RequestPriority request_priority, + HttpNetworkSession* session, + const ProxyInfo& proxy_info, + bool force_spdy_over_ssl, + bool want_spdy_over_npn, + const SSLConfig& ssl_config_for_origin, + const SSLConfig& ssl_config_for_proxy, + const BoundNetLog& net_log, + ClientSocketHandle* socket_handle, + OldCompletionCallback* callback); + +// A helper method that uses the passed in proxy information to initialize a +// ClientSocketHandle with the relevant socket pool. Use this method for +// a raw socket connection to a host-port pair (that needs to tunnel through +// the proxies). +NET_EXPORT int InitSocketHandleForRawConnect( + const HostPortPair& host_port_pair, + HttpNetworkSession* session, + const ProxyInfo& proxy_info, + const SSLConfig& ssl_config_for_origin, + const SSLConfig& ssl_config_for_proxy, + const BoundNetLog& net_log, + ClientSocketHandle* socket_handle, + OldCompletionCallback* callback); + +// Similar to InitSocketHandleForHttpRequest except that it initiates the +// desired number of preconnect streams from the relevant socket pool. +int PreconnectSocketsForHttpRequest( + const GURL& request_url, + const HttpRequestHeaders& request_extra_headers, + int request_load_flags, + RequestPriority request_priority, + HttpNetworkSession* session, + const ProxyInfo& proxy_info, + bool force_spdy_over_ssl, + bool want_spdy_over_npn, + const SSLConfig& ssl_config_for_origin, + const SSLConfig& ssl_config_for_proxy, + const BoundNetLog& net_log, + int num_preconnect_streams); + } // namespace net #endif // NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_ diff --git a/net/socket/client_socket_pool_manager_impl.cc b/net/socket/client_socket_pool_manager_impl.cc new file mode 100644 index 0000000..3626ec7 --- /dev/null +++ b/net/socket/client_socket_pool_manager_impl.cc @@ -0,0 +1,394 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/socket/client_socket_pool_manager_impl.h" + +#include "base/logging.h" +#include "base/values.h" +#include "net/base/ssl_config_service.h" +#include "net/http/http_proxy_client_socket_pool.h" +#include "net/socket/socks_client_socket_pool.h" +#include "net/socket/ssl_client_socket_pool.h" +#include "net/socket/transport_client_socket_pool.h" + +namespace net { + +namespace { + +// Appends information about all |socket_pools| to the end of |list|. +template <class MapType> +void AddSocketPoolsToList(ListValue* list, + const MapType& socket_pools, + const std::string& type, + bool include_nested_pools) { + for (typename MapType::const_iterator it = socket_pools.begin(); + it != socket_pools.end(); it++) { + list->Append(it->second->GetInfoAsValue(it->first.ToString(), + type, + include_nested_pools)); + } +} + +} // namespace + +ClientSocketPoolManagerImpl::ClientSocketPoolManagerImpl( + NetLog* net_log, + ClientSocketFactory* socket_factory, + HostResolver* host_resolver, + CertVerifier* cert_verifier, + OriginBoundCertService* origin_bound_cert_service, + DnsRRResolver* dnsrr_resolver, + DnsCertProvenanceChecker* dns_cert_checker, + SSLHostInfoFactory* ssl_host_info_factory, + ProxyService* proxy_service, + SSLConfigService* ssl_config_service) + : net_log_(net_log), + socket_factory_(socket_factory), + host_resolver_(host_resolver), + cert_verifier_(cert_verifier), + origin_bound_cert_service_(origin_bound_cert_service), + dnsrr_resolver_(dnsrr_resolver), + dns_cert_checker_(dns_cert_checker), + ssl_host_info_factory_(ssl_host_info_factory), + proxy_service_(proxy_service), + ssl_config_service_(ssl_config_service), + transport_pool_histograms_("TCP"), + transport_socket_pool_(new TransportClientSocketPool( + max_sockets_per_pool(), max_sockets_per_group(), + &transport_pool_histograms_, + host_resolver, + socket_factory_, + net_log)), + ssl_pool_histograms_("SSL2"), + ssl_socket_pool_(new SSLClientSocketPool( + max_sockets_per_pool(), max_sockets_per_group(), + &ssl_pool_histograms_, + host_resolver, + cert_verifier, + origin_bound_cert_service, + dnsrr_resolver, + dns_cert_checker, + ssl_host_info_factory, + socket_factory, + transport_socket_pool_.get(), + NULL /* no socks proxy */, + NULL /* no http proxy */, + ssl_config_service, + net_log)), + transport_for_socks_pool_histograms_("TCPforSOCKS"), + socks_pool_histograms_("SOCK"), + transport_for_http_proxy_pool_histograms_("TCPforHTTPProxy"), + transport_for_https_proxy_pool_histograms_("TCPforHTTPSProxy"), + ssl_for_https_proxy_pool_histograms_("SSLforHTTPSProxy"), + http_proxy_pool_histograms_("HTTPProxy"), + ssl_socket_pool_for_proxies_histograms_("SSLForProxies") { + CertDatabase::AddObserver(this); +} + +ClientSocketPoolManagerImpl::~ClientSocketPoolManagerImpl() { + CertDatabase::RemoveObserver(this); +} + +void ClientSocketPoolManagerImpl::FlushSocketPools() { + // Flush the highest level pools first, since higher level pools may release + // stuff to the lower level pools. + + for (SSLSocketPoolMap::const_iterator it = + ssl_socket_pools_for_proxies_.begin(); + it != ssl_socket_pools_for_proxies_.end(); + ++it) + it->second->Flush(); + + for (HTTPProxySocketPoolMap::const_iterator it = + http_proxy_socket_pools_.begin(); + it != http_proxy_socket_pools_.end(); + ++it) + it->second->Flush(); + + for (SSLSocketPoolMap::const_iterator it = + ssl_socket_pools_for_https_proxies_.begin(); + it != ssl_socket_pools_for_https_proxies_.end(); + ++it) + it->second->Flush(); + + for (TransportSocketPoolMap::const_iterator it = + transport_socket_pools_for_https_proxies_.begin(); + it != transport_socket_pools_for_https_proxies_.end(); + ++it) + it->second->Flush(); + + for (TransportSocketPoolMap::const_iterator it = + transport_socket_pools_for_http_proxies_.begin(); + it != transport_socket_pools_for_http_proxies_.end(); + ++it) + it->second->Flush(); + + for (SOCKSSocketPoolMap::const_iterator it = + socks_socket_pools_.begin(); + it != socks_socket_pools_.end(); + ++it) + it->second->Flush(); + + for (TransportSocketPoolMap::const_iterator it = + transport_socket_pools_for_socks_proxies_.begin(); + it != transport_socket_pools_for_socks_proxies_.end(); + ++it) + it->second->Flush(); + + ssl_socket_pool_->Flush(); + transport_socket_pool_->Flush(); +} + +void ClientSocketPoolManagerImpl::CloseIdleSockets() { + // Close sockets in the highest level pools first, since higher level pools' + // sockets may release stuff to the lower level pools. + for (SSLSocketPoolMap::const_iterator it = + ssl_socket_pools_for_proxies_.begin(); + it != ssl_socket_pools_for_proxies_.end(); + ++it) + it->second->CloseIdleSockets(); + + for (HTTPProxySocketPoolMap::const_iterator it = + http_proxy_socket_pools_.begin(); + it != http_proxy_socket_pools_.end(); + ++it) + it->second->CloseIdleSockets(); + + for (SSLSocketPoolMap::const_iterator it = + ssl_socket_pools_for_https_proxies_.begin(); + it != ssl_socket_pools_for_https_proxies_.end(); + ++it) + it->second->CloseIdleSockets(); + + for (TransportSocketPoolMap::const_iterator it = + transport_socket_pools_for_https_proxies_.begin(); + it != transport_socket_pools_for_https_proxies_.end(); + ++it) + it->second->CloseIdleSockets(); + + for (TransportSocketPoolMap::const_iterator it = + transport_socket_pools_for_http_proxies_.begin(); + it != transport_socket_pools_for_http_proxies_.end(); + ++it) + it->second->CloseIdleSockets(); + + for (SOCKSSocketPoolMap::const_iterator it = + socks_socket_pools_.begin(); + it != socks_socket_pools_.end(); + ++it) + it->second->CloseIdleSockets(); + + for (TransportSocketPoolMap::const_iterator it = + transport_socket_pools_for_socks_proxies_.begin(); + it != transport_socket_pools_for_socks_proxies_.end(); + ++it) + it->second->CloseIdleSockets(); + + ssl_socket_pool_->CloseIdleSockets(); + transport_socket_pool_->CloseIdleSockets(); +} + +TransportClientSocketPool* +ClientSocketPoolManagerImpl::GetTransportSocketPool() { + return transport_socket_pool_.get(); +} + +SSLClientSocketPool* ClientSocketPoolManagerImpl::GetSSLSocketPool() { + return ssl_socket_pool_.get(); +} + +SOCKSClientSocketPool* ClientSocketPoolManagerImpl::GetSocketPoolForSOCKSProxy( + const HostPortPair& socks_proxy) { + SOCKSSocketPoolMap::const_iterator it = socks_socket_pools_.find(socks_proxy); + if (it != socks_socket_pools_.end()) { + DCHECK(ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); + return it->second; + } + + DCHECK(!ContainsKey(transport_socket_pools_for_socks_proxies_, socks_proxy)); + + std::pair<TransportSocketPoolMap::iterator, bool> tcp_ret = + transport_socket_pools_for_socks_proxies_.insert( + std::make_pair( + socks_proxy, + new TransportClientSocketPool( + max_sockets_per_proxy_server(), + max_sockets_per_group(), + &transport_for_socks_pool_histograms_, + host_resolver_, + socket_factory_, + net_log_))); + DCHECK(tcp_ret.second); + + std::pair<SOCKSSocketPoolMap::iterator, bool> ret = + socks_socket_pools_.insert( + std::make_pair(socks_proxy, new SOCKSClientSocketPool( + max_sockets_per_proxy_server(), + max_sockets_per_group(), + &socks_pool_histograms_, + host_resolver_, + tcp_ret.first->second, + net_log_))); + + return ret.first->second; +} + +HttpProxyClientSocketPool* +ClientSocketPoolManagerImpl::GetSocketPoolForHTTPProxy( + const HostPortPair& http_proxy) { + HTTPProxySocketPoolMap::const_iterator it = + http_proxy_socket_pools_.find(http_proxy); + if (it != http_proxy_socket_pools_.end()) { + DCHECK(ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); + DCHECK(ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); + DCHECK(ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); + return it->second; + } + + DCHECK(!ContainsKey(transport_socket_pools_for_http_proxies_, http_proxy)); + DCHECK(!ContainsKey(transport_socket_pools_for_https_proxies_, http_proxy)); + DCHECK(!ContainsKey(ssl_socket_pools_for_https_proxies_, http_proxy)); + + std::pair<TransportSocketPoolMap::iterator, bool> tcp_http_ret = + transport_socket_pools_for_http_proxies_.insert( + std::make_pair( + http_proxy, + new TransportClientSocketPool( + max_sockets_per_proxy_server(), + max_sockets_per_group(), + &transport_for_http_proxy_pool_histograms_, + host_resolver_, + socket_factory_, + net_log_))); + DCHECK(tcp_http_ret.second); + + std::pair<TransportSocketPoolMap::iterator, bool> tcp_https_ret = + transport_socket_pools_for_https_proxies_.insert( + std::make_pair( + http_proxy, + new TransportClientSocketPool( + max_sockets_per_proxy_server(), + max_sockets_per_group(), + &transport_for_https_proxy_pool_histograms_, + host_resolver_, + socket_factory_, + net_log_))); + DCHECK(tcp_https_ret.second); + + std::pair<SSLSocketPoolMap::iterator, bool> ssl_https_ret = + ssl_socket_pools_for_https_proxies_.insert( + std::make_pair( + http_proxy, + new SSLClientSocketPool( + max_sockets_per_proxy_server(), + max_sockets_per_group(), + &ssl_for_https_proxy_pool_histograms_, + host_resolver_, + cert_verifier_, + origin_bound_cert_service_, + dnsrr_resolver_, + dns_cert_checker_, + ssl_host_info_factory_, + socket_factory_, + tcp_https_ret.first->second /* https proxy */, + NULL /* no socks proxy */, + NULL /* no http proxy */, + ssl_config_service_, net_log_))); + DCHECK(tcp_https_ret.second); + + std::pair<HTTPProxySocketPoolMap::iterator, bool> ret = + http_proxy_socket_pools_.insert( + std::make_pair( + http_proxy, + new HttpProxyClientSocketPool( + max_sockets_per_proxy_server(), + max_sockets_per_group(), + &http_proxy_pool_histograms_, + host_resolver_, + tcp_http_ret.first->second, + ssl_https_ret.first->second, + net_log_))); + + return ret.first->second; +} + +SSLClientSocketPool* ClientSocketPoolManagerImpl::GetSocketPoolForSSLWithProxy( + const HostPortPair& proxy_server) { + SSLSocketPoolMap::const_iterator it = + ssl_socket_pools_for_proxies_.find(proxy_server); + if (it != ssl_socket_pools_for_proxies_.end()) + return it->second; + + SSLClientSocketPool* new_pool = new SSLClientSocketPool( + max_sockets_per_proxy_server(), max_sockets_per_group(), + &ssl_pool_histograms_, + host_resolver_, + cert_verifier_, + origin_bound_cert_service_, + dnsrr_resolver_, + dns_cert_checker_, + ssl_host_info_factory_, + socket_factory_, + NULL, /* no tcp pool, we always go through a proxy */ + GetSocketPoolForSOCKSProxy(proxy_server), + GetSocketPoolForHTTPProxy(proxy_server), + ssl_config_service_, + net_log_); + + std::pair<SSLSocketPoolMap::iterator, bool> ret = + ssl_socket_pools_for_proxies_.insert(std::make_pair(proxy_server, + new_pool)); + + return ret.first->second; +} + +Value* ClientSocketPoolManagerImpl::SocketPoolInfoToValue() const { + ListValue* list = new ListValue(); + list->Append(transport_socket_pool_->GetInfoAsValue("transport_socket_pool", + "transport_socket_pool", + false)); + // Third parameter is false because |ssl_socket_pool_| uses + // |transport_socket_pool_| internally, and do not want to add it a second + // time. + list->Append(ssl_socket_pool_->GetInfoAsValue("ssl_socket_pool", + "ssl_socket_pool", + false)); + AddSocketPoolsToList(list, + http_proxy_socket_pools_, + "http_proxy_socket_pool", + true); + AddSocketPoolsToList(list, + socks_socket_pools_, + "socks_socket_pool", + true); + + // Third parameter is false because |ssl_socket_pools_for_proxies_| use + // socket pools in |http_proxy_socket_pools_| and |socks_socket_pools_|. + AddSocketPoolsToList(list, + ssl_socket_pools_for_proxies_, + "ssl_socket_pool_for_proxies", + false); + return list; +} + +void ClientSocketPoolManagerImpl::OnUserCertAdded(const X509Certificate* cert) { + FlushSocketPools(); +} + +void ClientSocketPoolManagerImpl::OnCertTrustChanged( + const X509Certificate* cert) { + // We should flush the socket pools if we removed trust from a + // cert, because a previously trusted server may have become + // untrusted. + // + // We should not flush the socket pools if we added trust to a + // cert. + // + // Since the OnCertTrustChanged method doesn't tell us what + // kind of trust change it is, we have to flush the socket + // pools to be safe. + FlushSocketPools(); +} + +} // namespace net diff --git a/net/socket/client_socket_pool_manager_impl.h b/net/socket/client_socket_pool_manager_impl.h new file mode 100644 index 0000000..554cfcb --- /dev/null +++ b/net/socket/client_socket_pool_manager_impl.h @@ -0,0 +1,152 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_ +#define NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_ +#pragma once + +#include <map> +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/stl_util.h" +#include "base/template_util.h" +#include "base/threading/non_thread_safe.h" +#include "net/base/cert_database.h" +#include "net/socket/client_socket_pool_histograms.h" +#include "net/socket/client_socket_pool_manager.h" + +namespace net { + +class CertVerifier; +class ClientSocketFactory; +class ClientSocketPoolHistograms; +class DnsCertProvenanceChecker; +class DnsRRResolver; +class HttpProxyClientSocketPool; +class HostResolver; +class NetLog; +class OriginBoundCertService; +class ProxyService; +class SOCKSClientSocketPool; +class SSLClientSocketPool; +class SSLConfigService; +class SSLHostInfoFactory; +class TransportClientSocketPool; + +namespace internal { + +// A helper class for auto-deleting Values in the destructor. +template <typename Key, typename Value> +class OwnedPoolMap : public std::map<Key, Value> { + public: + OwnedPoolMap() { + COMPILE_ASSERT(base::is_pointer<Value>::value, + value_must_be_a_pointer); + } + + ~OwnedPoolMap() { + STLDeleteValues(this); + } +}; + +} // namespace internal + +class ClientSocketPoolManagerImpl : public base::NonThreadSafe, + public ClientSocketPoolManager, + public CertDatabase::Observer { + public: + ClientSocketPoolManagerImpl(NetLog* net_log, + ClientSocketFactory* socket_factory, + HostResolver* host_resolver, + CertVerifier* cert_verifier, + OriginBoundCertService* origin_bound_cert_service, + DnsRRResolver* dnsrr_resolver, + DnsCertProvenanceChecker* dns_cert_checker, + SSLHostInfoFactory* ssl_host_info_factory, + ProxyService* proxy_service, + SSLConfigService* ssl_config_service); + virtual ~ClientSocketPoolManagerImpl(); + + virtual void FlushSocketPools() OVERRIDE; + virtual void CloseIdleSockets() OVERRIDE; + + virtual TransportClientSocketPool* GetTransportSocketPool() OVERRIDE; + + virtual SSLClientSocketPool* GetSSLSocketPool() OVERRIDE; + + virtual SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy( + const HostPortPair& socks_proxy) OVERRIDE; + + virtual HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy( + const HostPortPair& http_proxy) OVERRIDE; + + virtual SSLClientSocketPool* GetSocketPoolForSSLWithProxy( + const HostPortPair& proxy_server) OVERRIDE; + + // Creates a Value summary of the state of the socket pools. The caller is + // responsible for deleting the returned value. + virtual base::Value* SocketPoolInfoToValue() const OVERRIDE; + + // CertDatabase::Observer methods: + virtual void OnUserCertAdded(const X509Certificate* cert) OVERRIDE; + virtual void OnCertTrustChanged(const X509Certificate* cert) OVERRIDE; + + private: + typedef internal::OwnedPoolMap<HostPortPair, TransportClientSocketPool*> + TransportSocketPoolMap; + typedef internal::OwnedPoolMap<HostPortPair, SOCKSClientSocketPool*> + SOCKSSocketPoolMap; + typedef internal::OwnedPoolMap<HostPortPair, HttpProxyClientSocketPool*> + HTTPProxySocketPoolMap; + typedef internal::OwnedPoolMap<HostPortPair, SSLClientSocketPool*> + SSLSocketPoolMap; + + NetLog* const net_log_; + ClientSocketFactory* const socket_factory_; + HostResolver* const host_resolver_; + CertVerifier* const cert_verifier_; + OriginBoundCertService* const origin_bound_cert_service_; + DnsRRResolver* const dnsrr_resolver_; + DnsCertProvenanceChecker* const dns_cert_checker_; + SSLHostInfoFactory* const ssl_host_info_factory_; + ProxyService* const proxy_service_; + const scoped_refptr<SSLConfigService> ssl_config_service_; + + // Note: this ordering is important. + + ClientSocketPoolHistograms transport_pool_histograms_; + scoped_ptr<TransportClientSocketPool> transport_socket_pool_; + + ClientSocketPoolHistograms ssl_pool_histograms_; + scoped_ptr<SSLClientSocketPool> ssl_socket_pool_; + + ClientSocketPoolHistograms transport_for_socks_pool_histograms_; + TransportSocketPoolMap transport_socket_pools_for_socks_proxies_; + + ClientSocketPoolHistograms socks_pool_histograms_; + SOCKSSocketPoolMap socks_socket_pools_; + + ClientSocketPoolHistograms transport_for_http_proxy_pool_histograms_; + TransportSocketPoolMap transport_socket_pools_for_http_proxies_; + + ClientSocketPoolHistograms transport_for_https_proxy_pool_histograms_; + TransportSocketPoolMap transport_socket_pools_for_https_proxies_; + + ClientSocketPoolHistograms ssl_for_https_proxy_pool_histograms_; + SSLSocketPoolMap ssl_socket_pools_for_https_proxies_; + + ClientSocketPoolHistograms http_proxy_pool_histograms_; + HTTPProxySocketPoolMap http_proxy_socket_pools_; + + ClientSocketPoolHistograms ssl_socket_pool_for_proxies_histograms_; + SSLSocketPoolMap ssl_socket_pools_for_proxies_; + + DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolManagerImpl); +}; + +} // namespace net + +#endif // NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_ diff --git a/net/socket/mock_client_socket_pool_manager.cc b/net/socket/mock_client_socket_pool_manager.cc new file mode 100644 index 0000000..717a0ae --- /dev/null +++ b/net/socket/mock_client_socket_pool_manager.cc @@ -0,0 +1,94 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/socket/mock_client_socket_pool_manager.h" + +#include "net/http/http_proxy_client_socket_pool.h" +#include "net/socket/socks_client_socket_pool.h" +#include "net/socket/ssl_client_socket_pool.h" +#include "net/socket/transport_client_socket_pool.h" + +namespace net { + +MockClientSocketPoolManager::MockClientSocketPoolManager() {} +MockClientSocketPoolManager::~MockClientSocketPoolManager() {} + +void MockClientSocketPoolManager::SetTransportSocketPool( + TransportClientSocketPool* pool) { + transport_socket_pool_.reset(pool); +} + +void MockClientSocketPoolManager::SetSSLSocketPool( + SSLClientSocketPool* pool) { + ssl_socket_pool_.reset(pool); +} + +void MockClientSocketPoolManager::SetSocketPoolForSOCKSProxy( + const HostPortPair& socks_proxy, + SOCKSClientSocketPool* pool) { + socks_socket_pools_[socks_proxy] = pool; +} + +void MockClientSocketPoolManager::SetSocketPoolForHTTPProxy( + const HostPortPair& http_proxy, + HttpProxyClientSocketPool* pool) { + http_proxy_socket_pools_[http_proxy] = pool; +} + +void MockClientSocketPoolManager::SetSocketPoolForSSLWithProxy( + const HostPortPair& proxy_server, + SSLClientSocketPool* pool) { + ssl_socket_pools_for_proxies_[proxy_server] = pool; +} + +void MockClientSocketPoolManager::FlushSocketPools() { + NOTIMPLEMENTED(); +} + +void MockClientSocketPoolManager::CloseIdleSockets() { + NOTIMPLEMENTED(); +} + +TransportClientSocketPool* +MockClientSocketPoolManager::GetTransportSocketPool() { + return transport_socket_pool_.get(); +} + +SSLClientSocketPool* MockClientSocketPoolManager::GetSSLSocketPool() { + return ssl_socket_pool_.get(); +} + +SOCKSClientSocketPool* MockClientSocketPoolManager::GetSocketPoolForSOCKSProxy( + const HostPortPair& socks_proxy) { + SOCKSSocketPoolMap::const_iterator it = socks_socket_pools_.find(socks_proxy); + if (it != socks_socket_pools_.end()) + return it->second; + return NULL; +} + +HttpProxyClientSocketPool* +MockClientSocketPoolManager::GetSocketPoolForHTTPProxy( + const HostPortPair& http_proxy) { + HTTPProxySocketPoolMap::const_iterator it = + http_proxy_socket_pools_.find(http_proxy); + if (it != http_proxy_socket_pools_.end()) + return it->second; + return NULL; +} + +SSLClientSocketPool* MockClientSocketPoolManager::GetSocketPoolForSSLWithProxy( + const HostPortPair& proxy_server) { + SSLSocketPoolMap::const_iterator it = + ssl_socket_pools_for_proxies_.find(proxy_server); + if (it != ssl_socket_pools_for_proxies_.end()) + return it->second; + return NULL; +} + +Value* MockClientSocketPoolManager::SocketPoolInfoToValue() const { + NOTIMPLEMENTED(); + return NULL; +} + +} // namespace net diff --git a/net/socket/mock_client_socket_pool_manager.h b/net/socket/mock_client_socket_pool_manager.h new file mode 100644 index 0000000..cf8eceb --- /dev/null +++ b/net/socket/mock_client_socket_pool_manager.h @@ -0,0 +1,64 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_SOCKET_MOCK_CLIENT_SOCKET_POOL_MANAGER_H_ +#define NET_SOCKET_MOCK_CLIENT_SOCKET_POOL_MANAGER_H_ +#pragma once + +#include "base/basictypes.h" +#include "net/socket/client_socket_pool_manager.h" +#include "net/socket/client_socket_pool_manager_impl.h" + +namespace net { + +class MockClientSocketPoolManager : public ClientSocketPoolManager { + public: + MockClientSocketPoolManager(); + virtual ~MockClientSocketPoolManager(); + + // Sets "override" socket pools that get used instead. + void SetTransportSocketPool(TransportClientSocketPool* pool); + void SetSSLSocketPool(SSLClientSocketPool* pool); + void SetSocketPoolForSOCKSProxy(const HostPortPair& socks_proxy, + SOCKSClientSocketPool* pool); + void SetSocketPoolForHTTPProxy(const HostPortPair& http_proxy, + HttpProxyClientSocketPool* pool); + void SetSocketPoolForSSLWithProxy(const HostPortPair& proxy_server, + SSLClientSocketPool* pool); + + // ClientSocketPoolManager methods: + virtual void FlushSocketPools() OVERRIDE; + virtual void CloseIdleSockets() OVERRIDE; + virtual TransportClientSocketPool* GetTransportSocketPool() OVERRIDE; + virtual SSLClientSocketPool* GetSSLSocketPool() OVERRIDE; + virtual SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy( + const HostPortPair& socks_proxy) OVERRIDE; + virtual HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy( + const HostPortPair& http_proxy) OVERRIDE; + virtual SSLClientSocketPool* GetSocketPoolForSSLWithProxy( + const HostPortPair& proxy_server) OVERRIDE; + virtual base::Value* SocketPoolInfoToValue() const OVERRIDE; + + private: + typedef internal::OwnedPoolMap<HostPortPair, TransportClientSocketPool*> + TransportSocketPoolMap; + typedef internal::OwnedPoolMap<HostPortPair, SOCKSClientSocketPool*> + SOCKSSocketPoolMap; + typedef internal::OwnedPoolMap<HostPortPair, HttpProxyClientSocketPool*> + HTTPProxySocketPoolMap; + typedef internal::OwnedPoolMap<HostPortPair, SSLClientSocketPool*> + SSLSocketPoolMap; + + scoped_ptr<TransportClientSocketPool> transport_socket_pool_; + scoped_ptr<SSLClientSocketPool> ssl_socket_pool_; + SOCKSSocketPoolMap socks_socket_pools_; + HTTPProxySocketPoolMap http_proxy_socket_pools_; + SSLSocketPoolMap ssl_socket_pools_for_proxies_; + + DISALLOW_COPY_AND_ASSIGN(MockClientSocketPoolManager); +}; + +} // namespace net + +#endif // NET_SOCKET_MOCK_CLIENT_SOCKET_POOL_MANAGER_H_ diff --git a/net/spdy/spdy_http_stream_unittest.cc b/net/spdy/spdy_http_stream_unittest.cc index efce755..1af0810 100644 --- a/net/spdy/spdy_http_stream_unittest.cc +++ b/net/spdy/spdy_http_stream_unittest.cc @@ -39,7 +39,7 @@ class SpdyHttpStreamTest : public testing::Test { transport_params_, MEDIUM, &callback, - http_session_->transport_socket_pool(), + http_session_->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); return session_->InitializeWithSocket(connection.release(), false, OK); diff --git a/net/spdy/spdy_proxy_client_socket_unittest.cc b/net/spdy/spdy_proxy_client_socket_unittest.cc index 2df582d..323b6db 100644 --- a/net/spdy/spdy_proxy_client_socket_unittest.cc +++ b/net/spdy/spdy_proxy_client_socket_unittest.cc @@ -184,7 +184,7 @@ void SpdyProxyClientSocketTest::Initialize(MockRead* reads, EXPECT_EQ(OK, connection->Init(endpoint_host_port_pair_.ToString(), transport_params_, - LOWEST, NULL, session_->transport_socket_pool(), + LOWEST, NULL, session_->GetTransportSocketPool(), BoundNetLog())); spdy_session_->InitializeWithSocket(connection.release(), false, OK); diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc index 17eef50..0fc8e5c 100644 --- a/net/spdy/spdy_session_unittest.cc +++ b/net/spdy/spdy_session_unittest.cc @@ -145,7 +145,7 @@ TEST_F(SpdySessionTest, GoAway) { EXPECT_EQ(OK, connection->Init(test_host_port_pair.ToString(), transport_params, MEDIUM, - NULL, http_session->transport_socket_pool(), + NULL, http_session->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); @@ -218,7 +218,7 @@ TEST_F(SpdySessionTest, Ping) { transport_params, MEDIUM, NULL, - http_session->transport_socket_pool(), + http_session->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); @@ -309,7 +309,7 @@ TEST_F(SpdySessionTest, FailedPing) { transport_params, MEDIUM, NULL, - http_session->transport_socket_pool(), + http_session->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); @@ -553,7 +553,7 @@ TEST_F(SpdySessionTest, OnSettings) { EXPECT_EQ(OK, connection->Init(test_host_port_pair.ToString(), transport_params, MEDIUM, - NULL, http_session->transport_socket_pool(), + NULL, http_session->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); @@ -638,7 +638,7 @@ TEST_F(SpdySessionTest, CancelPendingCreateStream) { EXPECT_EQ(OK, connection->Init(test_host_port_pair.ToString(), transport_params, MEDIUM, - NULL, http_session->transport_socket_pool(), + NULL, http_session->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); @@ -737,7 +737,7 @@ TEST_F(SpdySessionTest, SendSettingsOnNewSession) { EXPECT_EQ(OK, connection->Init(test_host_port_pair.ToString(), transport_params, MEDIUM, - NULL, http_session->transport_socket_pool(), + NULL, http_session->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); MessageLoop::current()->RunAllPending(); @@ -811,7 +811,7 @@ void IPPoolingTest(bool clean_via_close_current_sessions) { EXPECT_EQ(OK, connection->Init(test_host_port_pair.ToString(), transport_params, MEDIUM, - NULL, http_session->transport_socket_pool(), + NULL, http_session->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); diff --git a/net/spdy/spdy_stream_unittest.cc b/net/spdy/spdy_stream_unittest.cc index 5232cf7..41d3190 100644 --- a/net/spdy/spdy_stream_unittest.cc +++ b/net/spdy/spdy_stream_unittest.cc @@ -192,7 +192,7 @@ TEST_F(SpdyStreamTest, SendDataAfterOpen) { transport_params, LOWEST, NULL, - session_->transport_socket_pool(), + session_->GetTransportSocketPool(), BoundNetLog())); session->InitializeWithSocket(connection.release(), false, OK); diff --git a/net/spdy/spdy_websocket_stream_unittest.cc b/net/spdy/spdy_websocket_stream_unittest.cc index 9feea1a..03c7e93 100644 --- a/net/spdy/spdy_websocket_stream_unittest.cc +++ b/net/spdy/spdy_websocket_stream_unittest.cc @@ -269,7 +269,7 @@ class SpdyWebSocketStreamTest : public testing::Test { EXPECT_EQ(ERR_IO_PENDING, connection->Init(host_port_pair_.ToString(), transport_params_, MEDIUM, &callback, - http_session_->transport_socket_pool(), + http_session_->GetTransportSocketPool(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); return session_->InitializeWithSocket(connection.release(), false, OK); diff --git a/net/websockets/websocket_job_unittest.cc b/net/websockets/websocket_job_unittest.cc index 9cf2280..efbebf3 100644 --- a/net/websockets/websocket_job_unittest.cc +++ b/net/websockets/websocket_job_unittest.cc @@ -277,7 +277,7 @@ class MockHttpTransactionFactory : public net::HttpTransactionFactory { transport_params_, net::MEDIUM, NULL, - http_session_->transport_socket_pool(), + http_session_->GetTransportSocketPool(), net::BoundNetLog())); EXPECT_EQ(net::OK, session_->InitializeWithSocket(connection, false, net::OK)); |