summaryrefslogtreecommitdiff
path: root/chromium/net/socket/ssl_client_socket_pool.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/socket/ssl_client_socket_pool.cc')
-rw-r--r--chromium/net/socket/ssl_client_socket_pool.cc222
1 files changed, 122 insertions, 100 deletions
diff --git a/chromium/net/socket/ssl_client_socket_pool.cc b/chromium/net/socket/ssl_client_socket_pool.cc
index fed268d4ee4..5d574b7edda 100644
--- a/chromium/net/socket/ssl_client_socket_pool.cc
+++ b/chromium/net/socket/ssl_client_socket_pool.cc
@@ -26,20 +26,18 @@
namespace net {
SSLSocketParams::SSLSocketParams(
- const scoped_refptr<TransportSocketParams>& transport_params,
- const scoped_refptr<SOCKSSocketParams>& socks_params,
+ const scoped_refptr<TransportSocketParams>& direct_params,
+ const scoped_refptr<SOCKSSocketParams>& socks_proxy_params,
const scoped_refptr<HttpProxySocketParams>& http_proxy_params,
- ProxyServer::Scheme proxy,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
PrivacyMode privacy_mode,
int load_flags,
bool force_spdy_over_ssl,
bool want_spdy_over_npn)
- : transport_params_(transport_params),
+ : direct_params_(direct_params),
+ socks_proxy_params_(socks_proxy_params),
http_proxy_params_(http_proxy_params),
- socks_params_(socks_params),
- proxy_(proxy),
host_and_port_(host_and_port),
ssl_config_(ssl_config),
privacy_mode_(privacy_mode),
@@ -47,39 +45,60 @@ SSLSocketParams::SSLSocketParams(
force_spdy_over_ssl_(force_spdy_over_ssl),
want_spdy_over_npn_(want_spdy_over_npn),
ignore_limits_(false) {
- switch (proxy_) {
- case ProxyServer::SCHEME_DIRECT:
- DCHECK(transport_params_.get() != NULL);
- DCHECK(http_proxy_params_.get() == NULL);
- DCHECK(socks_params_.get() == NULL);
- ignore_limits_ = transport_params_->ignore_limits();
- break;
- case ProxyServer::SCHEME_HTTP:
- case ProxyServer::SCHEME_HTTPS:
- DCHECK(transport_params_.get() == NULL);
- DCHECK(http_proxy_params_.get() != NULL);
- DCHECK(socks_params_.get() == NULL);
- ignore_limits_ = http_proxy_params_->ignore_limits();
- break;
- case ProxyServer::SCHEME_SOCKS4:
- case ProxyServer::SCHEME_SOCKS5:
- DCHECK(transport_params_.get() == NULL);
- DCHECK(http_proxy_params_.get() == NULL);
- DCHECK(socks_params_.get() != NULL);
- ignore_limits_ = socks_params_->ignore_limits();
- break;
- default:
- LOG(DFATAL) << "unknown proxy type";
- break;
+ if (direct_params_) {
+ DCHECK(!socks_proxy_params_);
+ DCHECK(!http_proxy_params_);
+ ignore_limits_ = direct_params_->ignore_limits();
+ } else if (socks_proxy_params_) {
+ DCHECK(!http_proxy_params_);
+ ignore_limits_ = socks_proxy_params_->ignore_limits();
+ } else {
+ DCHECK(http_proxy_params_);
+ ignore_limits_ = http_proxy_params_->ignore_limits();
}
}
SSLSocketParams::~SSLSocketParams() {}
+SSLSocketParams::ConnectionType SSLSocketParams::GetConnectionType() const {
+ if (direct_params_) {
+ DCHECK(!socks_proxy_params_);
+ DCHECK(!http_proxy_params_);
+ return DIRECT;
+ }
+
+ if (socks_proxy_params_) {
+ DCHECK(!http_proxy_params_);
+ return SOCKS_PROXY;
+ }
+
+ DCHECK(http_proxy_params_);
+ return HTTP_PROXY;
+}
+
+const scoped_refptr<TransportSocketParams>&
+SSLSocketParams::GetDirectConnectionParams() const {
+ DCHECK_EQ(GetConnectionType(), DIRECT);
+ return direct_params_;
+}
+
+const scoped_refptr<SOCKSSocketParams>&
+SSLSocketParams::GetSocksProxyConnectionParams() const {
+ DCHECK_EQ(GetConnectionType(), SOCKS_PROXY);
+ return socks_proxy_params_;
+}
+
+const scoped_refptr<HttpProxySocketParams>&
+SSLSocketParams::GetHttpProxyConnectionParams() const {
+ DCHECK_EQ(GetConnectionType(), HTTP_PROXY);
+ return http_proxy_params_;
+}
+
// Timeout for the SSL handshake portion of the connect.
static const int kSSLHandshakeTimeoutInSeconds = 30;
SSLConnectJob::SSLConnectJob(const std::string& group_name,
+ RequestPriority priority,
const scoped_refptr<SSLSocketParams>& params,
const base::TimeDelta& timeout_duration,
TransportClientSocketPool* transport_pool,
@@ -92,6 +111,7 @@ SSLConnectJob::SSLConnectJob(const std::string& group_name,
NetLog* net_log)
: ConnectJob(group_name,
timeout_duration,
+ priority,
delegate,
BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
params_(params),
@@ -201,12 +221,14 @@ int SSLConnectJob::DoTransportConnect() {
next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE;
transport_socket_handle_.reset(new ClientSocketHandle());
- scoped_refptr<TransportSocketParams> transport_params =
- params_->transport_params();
- return transport_socket_handle_->Init(
- group_name(), transport_params,
- transport_params->destination().priority(), callback_, transport_pool_,
- net_log());
+ scoped_refptr<TransportSocketParams> direct_params =
+ params_->GetDirectConnectionParams();
+ return transport_socket_handle_->Init(group_name(),
+ direct_params,
+ priority(),
+ callback_,
+ transport_pool_,
+ net_log());
}
int SSLConnectJob::DoTransportConnectComplete(int result) {
@@ -220,10 +242,14 @@ int SSLConnectJob::DoSOCKSConnect() {
DCHECK(socks_pool_);
next_state_ = STATE_SOCKS_CONNECT_COMPLETE;
transport_socket_handle_.reset(new ClientSocketHandle());
- scoped_refptr<SOCKSSocketParams> socks_params = params_->socks_params();
- return transport_socket_handle_->Init(
- group_name(), socks_params, socks_params->destination().priority(),
- callback_, socks_pool_, net_log());
+ scoped_refptr<SOCKSSocketParams> socks_proxy_params =
+ params_->GetSocksProxyConnectionParams();
+ return transport_socket_handle_->Init(group_name(),
+ socks_proxy_params,
+ priority(),
+ callback_,
+ socks_pool_,
+ net_log());
}
int SSLConnectJob::DoSOCKSConnectComplete(int result) {
@@ -239,11 +265,13 @@ int SSLConnectJob::DoTunnelConnect() {
transport_socket_handle_.reset(new ClientSocketHandle());
scoped_refptr<HttpProxySocketParams> http_proxy_params =
- params_->http_proxy_params();
- return transport_socket_handle_->Init(
- group_name(), http_proxy_params,
- http_proxy_params->destination().priority(), callback_, http_proxy_pool_,
- net_log());
+ params_->GetHttpProxyConnectionParams();
+ return transport_socket_handle_->Init(group_name(),
+ http_proxy_params,
+ priority(),
+ callback_,
+ http_proxy_pool_,
+ net_log());
}
int SSLConnectJob::DoTunnelConnectComplete(int result) {
@@ -287,11 +315,11 @@ int SSLConnectJob::DoSSLConnect() {
connect_timing_.ssl_start = base::TimeTicks::Now();
- ssl_socket_.reset(client_socket_factory_->CreateSSLClientSocket(
- transport_socket_handle_.release(),
+ ssl_socket_ = client_socket_factory_->CreateSSLClientSocket(
+ transport_socket_handle_.Pass(),
params_->host_and_port(),
params_->ssl_config(),
- context_));
+ context_);
return ssl_socket_->Connect(callback_);
}
@@ -410,7 +438,7 @@ int SSLConnectJob::DoSSLConnectComplete(int result) {
}
if (result == OK || IsCertificateError(result)) {
- set_socket(ssl_socket_.release());
+ SetSocket(ssl_socket_.PassAs<StreamSocket>());
} else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
error_response_info_.cert_request_info = new SSLCertRequestInfo;
ssl_socket_->GetSSLCertRequestInfo(
@@ -420,23 +448,22 @@ int SSLConnectJob::DoSSLConnectComplete(int result) {
return result;
}
-int SSLConnectJob::ConnectInternal() {
- switch (params_->proxy()) {
- case ProxyServer::SCHEME_DIRECT:
- next_state_ = STATE_TRANSPORT_CONNECT;
- break;
- case ProxyServer::SCHEME_HTTP:
- case ProxyServer::SCHEME_HTTPS:
- next_state_ = STATE_TUNNEL_CONNECT;
- break;
- case ProxyServer::SCHEME_SOCKS4:
- case ProxyServer::SCHEME_SOCKS5:
- next_state_ = STATE_SOCKS_CONNECT;
- break;
- default:
- NOTREACHED() << "unknown proxy type";
- break;
+SSLConnectJob::State SSLConnectJob::GetInitialState(
+ SSLSocketParams::ConnectionType connection_type) {
+ switch (connection_type) {
+ case SSLSocketParams::DIRECT:
+ return STATE_TRANSPORT_CONNECT;
+ case SSLSocketParams::HTTP_PROXY:
+ return STATE_TUNNEL_CONNECT;
+ case SSLSocketParams::SOCKS_PROXY:
+ return STATE_SOCKS_CONNECT;
}
+ NOTREACHED();
+ return STATE_NONE;
+}
+
+int SSLConnectJob::ConnectInternal() {
+ next_state_ = GetInitialState(params_->GetConnectionType());
return DoLoop(OK);
}
@@ -491,7 +518,7 @@ SSLClientSocketPool::SSLClientSocketPool(
: transport_pool_(transport_pool),
socks_pool_(socks_pool),
http_proxy_pool_(http_proxy_pool),
- base_(max_sockets, max_sockets_per_group, histograms,
+ base_(this, max_sockets, max_sockets_per_group, histograms,
ClientSocketPool::unused_idle_socket_timeout(),
ClientSocketPool::used_idle_socket_timeout(),
new SSLConnectJobFactory(transport_pool,
@@ -509,32 +536,28 @@ SSLClientSocketPool::SSLClientSocketPool(
if (ssl_config_service_.get())
ssl_config_service_->AddObserver(this);
if (transport_pool_)
- transport_pool_->AddLayeredPool(this);
+ base_.AddLowerLayeredPool(transport_pool_);
if (socks_pool_)
- socks_pool_->AddLayeredPool(this);
+ base_.AddLowerLayeredPool(socks_pool_);
if (http_proxy_pool_)
- http_proxy_pool_->AddLayeredPool(this);
+ base_.AddLowerLayeredPool(http_proxy_pool_);
}
SSLClientSocketPool::~SSLClientSocketPool() {
- if (http_proxy_pool_)
- http_proxy_pool_->RemoveLayeredPool(this);
- if (socks_pool_)
- socks_pool_->RemoveLayeredPool(this);
- if (transport_pool_)
- transport_pool_->RemoveLayeredPool(this);
if (ssl_config_service_.get())
ssl_config_service_->RemoveObserver(this);
}
-ConnectJob* SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
+scoped_ptr<ConnectJob>
+SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const {
- return new SSLConnectJob(group_name, request.params(), ConnectionTimeout(),
- transport_pool_, socks_pool_, http_proxy_pool_,
- client_socket_factory_, host_resolver_,
- context_, delegate, net_log_);
+ return scoped_ptr<ConnectJob>(
+ new SSLConnectJob(group_name, request.priority(), request.params(),
+ ConnectionTimeout(), transport_pool_, socks_pool_,
+ http_proxy_pool_, client_socket_factory_,
+ host_resolver_, context_, delegate, net_log_));
}
base::TimeDelta
@@ -572,21 +595,15 @@ void SSLClientSocketPool::CancelRequest(const std::string& group_name,
}
void SSLClientSocketPool::ReleaseSocket(const std::string& group_name,
- StreamSocket* socket, int id) {
- base_.ReleaseSocket(group_name, socket, id);
+ scoped_ptr<StreamSocket> socket,
+ int id) {
+ base_.ReleaseSocket(group_name, socket.Pass(), id);
}
void SSLClientSocketPool::FlushWithError(int error) {
base_.FlushWithError(error);
}
-bool SSLClientSocketPool::IsStalled() const {
- return base_.IsStalled() ||
- (transport_pool_ && transport_pool_->IsStalled()) ||
- (socks_pool_ && socks_pool_->IsStalled()) ||
- (http_proxy_pool_ && http_proxy_pool_->IsStalled());
-}
-
void SSLClientSocketPool::CloseIdleSockets() {
base_.CloseIdleSockets();
}
@@ -605,14 +622,6 @@ LoadState SSLClientSocketPool::GetLoadState(
return base_.GetLoadState(group_name, handle);
}
-void SSLClientSocketPool::AddLayeredPool(LayeredPool* layered_pool) {
- base_.AddLayeredPool(layered_pool);
-}
-
-void SSLClientSocketPool::RemoveLayeredPool(LayeredPool* layered_pool) {
- base_.RemoveLayeredPool(layered_pool);
-}
-
base::DictionaryValue* SSLClientSocketPool::GetInfoAsValue(
const std::string& name,
const std::string& type,
@@ -648,14 +657,27 @@ ClientSocketPoolHistograms* SSLClientSocketPool::histograms() const {
return base_.histograms();
}
-void SSLClientSocketPool::OnSSLConfigChanged() {
- FlushWithError(ERR_NETWORK_CHANGED);
+bool SSLClientSocketPool::IsStalled() const {
+ return base_.IsStalled();
+}
+
+void SSLClientSocketPool::AddHigherLayeredPool(HigherLayeredPool* higher_pool) {
+ base_.AddHigherLayeredPool(higher_pool);
+}
+
+void SSLClientSocketPool::RemoveHigherLayeredPool(
+ HigherLayeredPool* higher_pool) {
+ base_.RemoveHigherLayeredPool(higher_pool);
}
bool SSLClientSocketPool::CloseOneIdleConnection() {
if (base_.CloseOneIdleSocket())
return true;
- return base_.CloseOneIdleConnectionInLayeredPool();
+ return base_.CloseOneIdleConnectionInHigherLayeredPool();
+}
+
+void SSLClientSocketPool::OnSSLConfigChanged() {
+ FlushWithError(ERR_NETWORK_CHANGED);
}
} // namespace net