diff options
Diffstat (limited to 'chromium/net/socket/ssl_client_socket_pool.cc')
-rw-r--r-- | chromium/net/socket/ssl_client_socket_pool.cc | 222 |
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 |