summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--jingle/notifier/base/proxy_resolving_client_socket.cc2
-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
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));