summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-17 16:42:02 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-17 16:42:02 +0000
commita42dbd14069319c4ead22992dc344bd91a2694ed (patch)
treee55680706b33026f6b9803e1e59d61896e6574ec /net
parente548a7852b2fe4ad6a740f778da5c3c4f2ce32a2 (diff)
downloadchromium_src-a42dbd14069319c4ead22992dc344bd91a2694ed.zip
chromium_src-a42dbd14069319c4ead22992dc344bd91a2694ed.tar.gz
chromium_src-a42dbd14069319c4ead22992dc344bd91a2694ed.tar.bz2
Make ClientSocketPoolManager into an interface.
This allows for using a MockClientSocketPoolManager. The default implementation has been moved into ClientSocketPoolManagerImpl. This allows HttpNetworkSessionPeer to replace the whole ClientSocketPoolManager rather than individual socket pools, which is necessary because socket pools will become more integrated in the future. BUG=none TEST=none Review URL: http://codereview.chromium.org/8572041 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110510 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r--net/http/http_network_session.cc39
-rw-r--r--net/http/http_network_session.h14
-rw-r--r--net/http/http_network_session_peer.cc46
-rw-r--r--net/http/http_network_session_peer.h22
-rw-r--r--net/http/http_network_transaction_unittest.cc57
-rw-r--r--net/http/http_stream_factory_impl_job.cc4
-rw-r--r--net/http/http_stream_factory_impl_unittest.cc29
-rw-r--r--net/net.gyp4
-rw-r--r--net/socket/client_socket_pool_manager.cc388
-rw-r--r--net/socket/client_socket_pool_manager.h260
-rw-r--r--net/socket/client_socket_pool_manager_impl.cc394
-rw-r--r--net/socket/client_socket_pool_manager_impl.h152
-rw-r--r--net/socket/mock_client_socket_pool_manager.cc94
-rw-r--r--net/socket/mock_client_socket_pool_manager.h64
-rw-r--r--net/spdy/spdy_http_stream_unittest.cc2
-rw-r--r--net/spdy/spdy_proxy_client_socket_unittest.cc2
-rw-r--r--net/spdy/spdy_session_unittest.cc14
-rw-r--r--net/spdy/spdy_stream_unittest.cc2
-rw-r--r--net/spdy/spdy_websocket_stream_unittest.cc2
-rw-r--r--net/websockets/websocket_job_unittest.cc2
20 files changed, 907 insertions, 684 deletions
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));