1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SOCKET_CONNECT_JOB_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_CONNECT_JOB_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <optional> 10*6777b538SAndroid Build Coastguard Worker #include <set> 11*6777b538SAndroid Build Coastguard Worker #include <string> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_helpers.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 17*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 18*6777b538SAndroid Build Coastguard Worker #include "base/timer/timer.h" 19*6777b538SAndroid Build Coastguard Worker #include "net/base/load_states.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/base/load_timing_info.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 22*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h" 23*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/host_resolver_results.h" 24*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/resolve_error_info.h" 25*6777b538SAndroid Build Coastguard Worker #include "net/http/http_server_properties.h" 26*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 27*6777b538SAndroid Build Coastguard Worker #include "net/socket/connection_attempts.h" 28*6777b538SAndroid Build Coastguard Worker #include "net/socket/next_proto.h" 29*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_tag.h" 30*6777b538SAndroid Build Coastguard Worker #include "net/socket/ssl_client_socket.h" 31*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_config.h" 32*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h" 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker namespace net { 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker class ClientSocketFactory; 37*6777b538SAndroid Build Coastguard Worker class HostPortPair; 38*6777b538SAndroid Build Coastguard Worker class HostResolver; 39*6777b538SAndroid Build Coastguard Worker struct HostResolverEndpointResult; 40*6777b538SAndroid Build Coastguard Worker class HttpAuthCache; 41*6777b538SAndroid Build Coastguard Worker class HttpAuthController; 42*6777b538SAndroid Build Coastguard Worker class HttpAuthHandlerFactory; 43*6777b538SAndroid Build Coastguard Worker class HttpResponseInfo; 44*6777b538SAndroid Build Coastguard Worker class HttpUserAgentSettings; 45*6777b538SAndroid Build Coastguard Worker class NetLog; 46*6777b538SAndroid Build Coastguard Worker class NetLogWithSource; 47*6777b538SAndroid Build Coastguard Worker class NetworkQualityEstimator; 48*6777b538SAndroid Build Coastguard Worker class ProxyDelegate; 49*6777b538SAndroid Build Coastguard Worker class QuicSessionPool; 50*6777b538SAndroid Build Coastguard Worker class SocketPerformanceWatcherFactory; 51*6777b538SAndroid Build Coastguard Worker class SocketTag; 52*6777b538SAndroid Build Coastguard Worker class SpdySessionPool; 53*6777b538SAndroid Build Coastguard Worker class SSLCertRequestInfo; 54*6777b538SAndroid Build Coastguard Worker class StreamSocket; 55*6777b538SAndroid Build Coastguard Worker class WebSocketEndpointLockManager; 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // Immutable socket parameters intended for shared use by all ConnectJob types. 58*6777b538SAndroid Build Coastguard Worker // Excludes priority because it can be modified over the lifetime of a 59*6777b538SAndroid Build Coastguard Worker // ConnectJob. Excludes connection timeout and NetLogWithSource because 60*6777b538SAndroid Build Coastguard Worker // ConnectJobs that wrap other ConnectJobs typically have different values for 61*6777b538SAndroid Build Coastguard Worker // those. 62*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT_PRIVATE CommonConnectJobParams { 63*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/1505765): Look into passing in HttpNetworkSession 64*6777b538SAndroid Build Coastguard Worker // instead. 65*6777b538SAndroid Build Coastguard Worker CommonConnectJobParams( 66*6777b538SAndroid Build Coastguard Worker ClientSocketFactory* client_socket_factory, 67*6777b538SAndroid Build Coastguard Worker HostResolver* host_resolver, 68*6777b538SAndroid Build Coastguard Worker HttpAuthCache* http_auth_cache, 69*6777b538SAndroid Build Coastguard Worker HttpAuthHandlerFactory* http_auth_handler_factory, 70*6777b538SAndroid Build Coastguard Worker SpdySessionPool* spdy_session_pool, 71*6777b538SAndroid Build Coastguard Worker const quic::ParsedQuicVersionVector* quic_supported_versions, 72*6777b538SAndroid Build Coastguard Worker QuicSessionPool* quic_session_pool, 73*6777b538SAndroid Build Coastguard Worker ProxyDelegate* proxy_delegate, 74*6777b538SAndroid Build Coastguard Worker const HttpUserAgentSettings* http_user_agent_settings, 75*6777b538SAndroid Build Coastguard Worker SSLClientContext* ssl_client_context, 76*6777b538SAndroid Build Coastguard Worker SocketPerformanceWatcherFactory* socket_performance_watcher_factory, 77*6777b538SAndroid Build Coastguard Worker NetworkQualityEstimator* network_quality_estimator, 78*6777b538SAndroid Build Coastguard Worker NetLog* net_log, 79*6777b538SAndroid Build Coastguard Worker WebSocketEndpointLockManager* websocket_endpoint_lock_manager, 80*6777b538SAndroid Build Coastguard Worker HttpServerProperties* http_server_properties, 81*6777b538SAndroid Build Coastguard Worker const NextProtoVector* alpn_protos, 82*6777b538SAndroid Build Coastguard Worker const SSLConfig::ApplicationSettings* application_settings, 83*6777b538SAndroid Build Coastguard Worker const bool* ignore_certificate_errors, 84*6777b538SAndroid Build Coastguard Worker const bool* enable_early_data); 85*6777b538SAndroid Build Coastguard Worker CommonConnectJobParams(const CommonConnectJobParams& other); 86*6777b538SAndroid Build Coastguard Worker ~CommonConnectJobParams(); 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker CommonConnectJobParams& operator=(const CommonConnectJobParams& other); 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker raw_ptr<ClientSocketFactory> client_socket_factory; 91*6777b538SAndroid Build Coastguard Worker raw_ptr<HostResolver> host_resolver; 92*6777b538SAndroid Build Coastguard Worker raw_ptr<HttpAuthCache> http_auth_cache; 93*6777b538SAndroid Build Coastguard Worker raw_ptr<HttpAuthHandlerFactory> http_auth_handler_factory; 94*6777b538SAndroid Build Coastguard Worker raw_ptr<SpdySessionPool> spdy_session_pool; 95*6777b538SAndroid Build Coastguard Worker raw_ptr<const quic::ParsedQuicVersionVector> quic_supported_versions; 96*6777b538SAndroid Build Coastguard Worker raw_ptr<QuicSessionPool> quic_session_pool; 97*6777b538SAndroid Build Coastguard Worker raw_ptr<ProxyDelegate> proxy_delegate; 98*6777b538SAndroid Build Coastguard Worker raw_ptr<const HttpUserAgentSettings> http_user_agent_settings; 99*6777b538SAndroid Build Coastguard Worker raw_ptr<SSLClientContext> ssl_client_context; 100*6777b538SAndroid Build Coastguard Worker raw_ptr<SocketPerformanceWatcherFactory> socket_performance_watcher_factory; 101*6777b538SAndroid Build Coastguard Worker raw_ptr<NetworkQualityEstimator> network_quality_estimator; 102*6777b538SAndroid Build Coastguard Worker raw_ptr<NetLog> net_log; 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker // This must only be non-null for WebSockets. 105*6777b538SAndroid Build Coastguard Worker raw_ptr<WebSocketEndpointLockManager> websocket_endpoint_lock_manager; 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker raw_ptr<HttpServerProperties> http_server_properties; 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker raw_ptr<const NextProtoVector> alpn_protos; 110*6777b538SAndroid Build Coastguard Worker raw_ptr<const SSLConfig::ApplicationSettings> application_settings; 111*6777b538SAndroid Build Coastguard Worker raw_ptr<const bool> ignore_certificate_errors; 112*6777b538SAndroid Build Coastguard Worker raw_ptr<const bool> enable_early_data; 113*6777b538SAndroid Build Coastguard Worker }; 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker // When a host resolution completes, OnHostResolutionCallback() is invoked. If 116*6777b538SAndroid Build Coastguard Worker // it returns |kContinue|, the ConnectJob can continue immediately. If it 117*6777b538SAndroid Build Coastguard Worker // returns |kMayBeDeletedAsync|, the ConnectJob may be slated for asychronous 118*6777b538SAndroid Build Coastguard Worker // destruction, so should post a task before continuing, in case it will be 119*6777b538SAndroid Build Coastguard Worker // deleted. The purpose of kMayBeDeletedAsync is to avoid needlessly creating 120*6777b538SAndroid Build Coastguard Worker // and connecting a socket when it might not be needed. 121*6777b538SAndroid Build Coastguard Worker enum class OnHostResolutionCallbackResult { 122*6777b538SAndroid Build Coastguard Worker kContinue, 123*6777b538SAndroid Build Coastguard Worker kMayBeDeletedAsync, 124*6777b538SAndroid Build Coastguard Worker }; 125*6777b538SAndroid Build Coastguard Worker 126*6777b538SAndroid Build Coastguard Worker // If non-null, invoked when host resolution completes. May not destroy the 127*6777b538SAndroid Build Coastguard Worker // ConnectJob synchronously, but may signal the ConnectJob may be destroyed 128*6777b538SAndroid Build Coastguard Worker // asynchronously. See OnHostResolutionCallbackResult above. 129*6777b538SAndroid Build Coastguard Worker // 130*6777b538SAndroid Build Coastguard Worker // `endpoint_results` is the list of endpoints the host being connected to was 131*6777b538SAndroid Build Coastguard Worker // resolved to, with the port fields populated to the port being connected to. 132*6777b538SAndroid Build Coastguard Worker using OnHostResolutionCallback = 133*6777b538SAndroid Build Coastguard Worker base::RepeatingCallback<OnHostResolutionCallbackResult( 134*6777b538SAndroid Build Coastguard Worker const HostPortPair& host_port_pair, 135*6777b538SAndroid Build Coastguard Worker const std::vector<HostResolverEndpointResult>& endpoint_results, 136*6777b538SAndroid Build Coastguard Worker const std::set<std::string>& aliases)>; 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker // ConnectJob provides an abstract interface for "connecting" a socket. 139*6777b538SAndroid Build Coastguard Worker // The connection may involve host resolution, tcp connection, ssl connection, 140*6777b538SAndroid Build Coastguard Worker // etc. 141*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE ConnectJob { 142*6777b538SAndroid Build Coastguard Worker public: 143*6777b538SAndroid Build Coastguard Worker // Alerts the delegate that the connection completed. |job| must be destroyed 144*6777b538SAndroid Build Coastguard Worker // by the delegate. A std::unique_ptr<> isn't used because the caller of this 145*6777b538SAndroid Build Coastguard Worker // function doesn't own |job|. 146*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE Delegate { 147*6777b538SAndroid Build Coastguard Worker public: 148*6777b538SAndroid Build Coastguard Worker Delegate() = default; 149*6777b538SAndroid Build Coastguard Worker 150*6777b538SAndroid Build Coastguard Worker Delegate(const Delegate&) = delete; 151*6777b538SAndroid Build Coastguard Worker Delegate& operator=(const Delegate&) = delete; 152*6777b538SAndroid Build Coastguard Worker 153*6777b538SAndroid Build Coastguard Worker virtual ~Delegate() = default; 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker // Alerts the delegate that the connection completed. |job| must be 156*6777b538SAndroid Build Coastguard Worker // destroyed by the delegate. A std::unique_ptr<> isn't used because the 157*6777b538SAndroid Build Coastguard Worker // caller of this function doesn't own |job|. 158*6777b538SAndroid Build Coastguard Worker virtual void OnConnectJobComplete(int result, ConnectJob* job) = 0; 159*6777b538SAndroid Build Coastguard Worker 160*6777b538SAndroid Build Coastguard Worker // Invoked when an HTTP proxy returns an HTTP auth challenge during tunnel 161*6777b538SAndroid Build Coastguard Worker // establishment. Always invoked asynchronously. The caller should use 162*6777b538SAndroid Build Coastguard Worker // |auth_controller| to set challenge response information and then invoke 163*6777b538SAndroid Build Coastguard Worker // |restart_with_auth_callback| to continue establishing a connection, or 164*6777b538SAndroid Build Coastguard Worker // delete the ConnectJob if it doesn't want to respond to the challenge. 165*6777b538SAndroid Build Coastguard Worker // 166*6777b538SAndroid Build Coastguard Worker // Will only be called once at a time. Neither OnConnectJobComplete() nor 167*6777b538SAndroid Build Coastguard Worker // OnNeedsProxyAuth() will be called synchronously when 168*6777b538SAndroid Build Coastguard Worker // |restart_with_auth_callback| is invoked. Will not be called after 169*6777b538SAndroid Build Coastguard Worker // OnConnectJobComplete() has been invoked. 170*6777b538SAndroid Build Coastguard Worker virtual void OnNeedsProxyAuth(const HttpResponseInfo& response, 171*6777b538SAndroid Build Coastguard Worker HttpAuthController* auth_controller, 172*6777b538SAndroid Build Coastguard Worker base::OnceClosure restart_with_auth_callback, 173*6777b538SAndroid Build Coastguard Worker ConnectJob* job) = 0; 174*6777b538SAndroid Build Coastguard Worker }; 175*6777b538SAndroid Build Coastguard Worker 176*6777b538SAndroid Build Coastguard Worker // A |timeout_duration| of 0 corresponds to no timeout. 177*6777b538SAndroid Build Coastguard Worker // 178*6777b538SAndroid Build Coastguard Worker // If |net_log| is non-NULL, the ConnectJob will use it for logging. 179*6777b538SAndroid Build Coastguard Worker // Otherwise, a new one will be created of type |net_log_source_type|. 180*6777b538SAndroid Build Coastguard Worker // 181*6777b538SAndroid Build Coastguard Worker // |net_log_connect_event_type| is the NetLog event type logged on Connect() 182*6777b538SAndroid Build Coastguard Worker // and connect completion. 183*6777b538SAndroid Build Coastguard Worker ConnectJob(RequestPriority priority, 184*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag, 185*6777b538SAndroid Build Coastguard Worker base::TimeDelta timeout_duration, 186*6777b538SAndroid Build Coastguard Worker const CommonConnectJobParams* common_connect_job_params, 187*6777b538SAndroid Build Coastguard Worker Delegate* delegate, 188*6777b538SAndroid Build Coastguard Worker const NetLogWithSource* net_log, 189*6777b538SAndroid Build Coastguard Worker NetLogSourceType net_log_source_type, 190*6777b538SAndroid Build Coastguard Worker NetLogEventType net_log_connect_event_type); 191*6777b538SAndroid Build Coastguard Worker 192*6777b538SAndroid Build Coastguard Worker ConnectJob(const ConnectJob&) = delete; 193*6777b538SAndroid Build Coastguard Worker ConnectJob& operator=(const ConnectJob&) = delete; 194*6777b538SAndroid Build Coastguard Worker 195*6777b538SAndroid Build Coastguard Worker virtual ~ConnectJob(); 196*6777b538SAndroid Build Coastguard Worker 197*6777b538SAndroid Build Coastguard Worker // Accessors net_log()198*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log() { return net_log_; } priority()199*6777b538SAndroid Build Coastguard Worker RequestPriority priority() const { return priority_; } 200*6777b538SAndroid Build Coastguard Worker 201*6777b538SAndroid Build Coastguard Worker // Releases ownership of the underlying socket to the caller. Returns the 202*6777b538SAndroid Build Coastguard Worker // released socket, or nullptr if there was a connection error. 203*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> PassSocket(); 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Worker // Returns the connected socket, or nullptr if PassSocket() has already been 206*6777b538SAndroid Build Coastguard Worker // called. Used to query the socket state. May only be called after the 207*6777b538SAndroid Build Coastguard Worker // ConnectJob completes. socket()208*6777b538SAndroid Build Coastguard Worker StreamSocket* socket() { return socket_.get(); } 209*6777b538SAndroid Build Coastguard Worker 210*6777b538SAndroid Build Coastguard Worker void ChangePriority(RequestPriority priority); 211*6777b538SAndroid Build Coastguard Worker 212*6777b538SAndroid Build Coastguard Worker // Begins connecting the socket. Returns OK on success, ERR_IO_PENDING if it 213*6777b538SAndroid Build Coastguard Worker // cannot complete synchronously without blocking, or another net error code 214*6777b538SAndroid Build Coastguard Worker // on error. In asynchronous completion, the ConnectJob will notify 215*6777b538SAndroid Build Coastguard Worker // |delegate_| via OnConnectJobComplete. In both asynchronous and synchronous 216*6777b538SAndroid Build Coastguard Worker // completion, ReleaseSocket() can be called to acquire the connected socket 217*6777b538SAndroid Build Coastguard Worker // if it succeeded. 218*6777b538SAndroid Build Coastguard Worker // 219*6777b538SAndroid Build Coastguard Worker // On completion, the ConnectJob must be destroyed synchronously, since it 220*6777b538SAndroid Build Coastguard Worker // doesn't bother to stop its timer when complete. 221*6777b538SAndroid Build Coastguard Worker // TODO(mmenke): Can that be fixed? 222*6777b538SAndroid Build Coastguard Worker int Connect(); 223*6777b538SAndroid Build Coastguard Worker 224*6777b538SAndroid Build Coastguard Worker // Returns the current LoadState of the ConnectJob. Each ConnectJob class must 225*6777b538SAndroid Build Coastguard Worker // start (optionally) with a LOAD_STATE_RESOLVING_HOST followed by 226*6777b538SAndroid Build Coastguard Worker // LOAD_STATE_CONNECTING, and never return to LOAD_STATE_CONNECTING. This 227*6777b538SAndroid Build Coastguard Worker // behavior is needed for backup ConnectJobs to function correctly. 228*6777b538SAndroid Build Coastguard Worker // 229*6777b538SAndroid Build Coastguard Worker // TODO(mmenke): Can something better be done here? 230*6777b538SAndroid Build Coastguard Worker virtual LoadState GetLoadState() const = 0; 231*6777b538SAndroid Build Coastguard Worker 232*6777b538SAndroid Build Coastguard Worker // Returns true if the ConnectJob has ever successfully established a TCP 233*6777b538SAndroid Build Coastguard Worker // connection. Used solely for deciding if a backup job is needed. Once it 234*6777b538SAndroid Build Coastguard Worker // starts returning true, must always return true when called in the future. 235*6777b538SAndroid Build Coastguard Worker // Not safe to call after NotifyComplete() is invoked. 236*6777b538SAndroid Build Coastguard Worker virtual bool HasEstablishedConnection() const = 0; 237*6777b538SAndroid Build Coastguard Worker 238*6777b538SAndroid Build Coastguard Worker // Returns a list of failed attempts to connect to the destination server. 239*6777b538SAndroid Build Coastguard Worker // Returns an empty list if connecting to a proxy. 240*6777b538SAndroid Build Coastguard Worker virtual ConnectionAttempts GetConnectionAttempts() const; 241*6777b538SAndroid Build Coastguard Worker 242*6777b538SAndroid Build Coastguard Worker // Returns error information about any host resolution attempt. 243*6777b538SAndroid Build Coastguard Worker virtual ResolveErrorInfo GetResolveErrorInfo() const = 0; 244*6777b538SAndroid Build Coastguard Worker 245*6777b538SAndroid Build Coastguard Worker // If the ConnectJob failed, returns true if the failure occurred after SSL 246*6777b538SAndroid Build Coastguard Worker // negotiation started. If the ConnectJob succeeded, the returned value is 247*6777b538SAndroid Build Coastguard Worker // undefined. 248*6777b538SAndroid Build Coastguard Worker virtual bool IsSSLError() const; 249*6777b538SAndroid Build Coastguard Worker 250*6777b538SAndroid Build Coastguard Worker // If the ConnectJob failed with ERR_SSL_CLIENT_AUTH_CERT_NEEDED, returns the 251*6777b538SAndroid Build Coastguard Worker // SSLCertRequestInfo received. Otherwise, returns nullptr. 252*6777b538SAndroid Build Coastguard Worker virtual scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo(); 253*6777b538SAndroid Build Coastguard Worker 254*6777b538SAndroid Build Coastguard Worker // Returns the `HostResolverEndpointResult` structure corresponding to the 255*6777b538SAndroid Build Coastguard Worker // chosen route. Should only be called on a successful connect. If the 256*6777b538SAndroid Build Coastguard Worker // `ConnectJob` does not make DNS queries, or does not use the SVCB/HTTPS 257*6777b538SAndroid Build Coastguard Worker // record, it may return `std::nullopt`, to avoid callers getting confused by 258*6777b538SAndroid Build Coastguard Worker // an empty `IPEndPoint` list. 259*6777b538SAndroid Build Coastguard Worker virtual std::optional<HostResolverEndpointResult> 260*6777b538SAndroid Build Coastguard Worker GetHostResolverEndpointResult() const; 261*6777b538SAndroid Build Coastguard Worker connect_timing()262*6777b538SAndroid Build Coastguard Worker const LoadTimingInfo::ConnectTiming& connect_timing() const { 263*6777b538SAndroid Build Coastguard Worker return connect_timing_; 264*6777b538SAndroid Build Coastguard Worker } 265*6777b538SAndroid Build Coastguard Worker 266*6777b538SAndroid Build Coastguard Worker // Sets |done_closure_| which will be called when |this| is deleted. 267*6777b538SAndroid Build Coastguard Worker void set_done_closure(base::OnceClosure done_closure); 268*6777b538SAndroid Build Coastguard Worker net_log()269*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log() const { return net_log_; } 270*6777b538SAndroid Build Coastguard Worker 271*6777b538SAndroid Build Coastguard Worker protected: socket_tag()272*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag() const { return socket_tag_; } client_socket_factory()273*6777b538SAndroid Build Coastguard Worker ClientSocketFactory* client_socket_factory() { 274*6777b538SAndroid Build Coastguard Worker return common_connect_job_params_->client_socket_factory; 275*6777b538SAndroid Build Coastguard Worker } host_resolver()276*6777b538SAndroid Build Coastguard Worker HostResolver* host_resolver() { 277*6777b538SAndroid Build Coastguard Worker return common_connect_job_params_->host_resolver; 278*6777b538SAndroid Build Coastguard Worker } http_user_agent_settings()279*6777b538SAndroid Build Coastguard Worker const HttpUserAgentSettings* http_user_agent_settings() const { 280*6777b538SAndroid Build Coastguard Worker return common_connect_job_params_->http_user_agent_settings; 281*6777b538SAndroid Build Coastguard Worker } ssl_client_context()282*6777b538SAndroid Build Coastguard Worker SSLClientContext* ssl_client_context() { 283*6777b538SAndroid Build Coastguard Worker return common_connect_job_params_->ssl_client_context; 284*6777b538SAndroid Build Coastguard Worker } socket_performance_watcher_factory()285*6777b538SAndroid Build Coastguard Worker SocketPerformanceWatcherFactory* socket_performance_watcher_factory() { 286*6777b538SAndroid Build Coastguard Worker return common_connect_job_params_->socket_performance_watcher_factory; 287*6777b538SAndroid Build Coastguard Worker } network_quality_estimator()288*6777b538SAndroid Build Coastguard Worker NetworkQualityEstimator* network_quality_estimator() { 289*6777b538SAndroid Build Coastguard Worker return common_connect_job_params_->network_quality_estimator; 290*6777b538SAndroid Build Coastguard Worker } websocket_endpoint_lock_manager()291*6777b538SAndroid Build Coastguard Worker WebSocketEndpointLockManager* websocket_endpoint_lock_manager() { 292*6777b538SAndroid Build Coastguard Worker return common_connect_job_params_->websocket_endpoint_lock_manager; 293*6777b538SAndroid Build Coastguard Worker } http_server_properties()294*6777b538SAndroid Build Coastguard Worker HttpServerProperties* http_server_properties() { 295*6777b538SAndroid Build Coastguard Worker return common_connect_job_params_->http_server_properties; 296*6777b538SAndroid Build Coastguard Worker } common_connect_job_params()297*6777b538SAndroid Build Coastguard Worker const CommonConnectJobParams* common_connect_job_params() const { 298*6777b538SAndroid Build Coastguard Worker return common_connect_job_params_; 299*6777b538SAndroid Build Coastguard Worker } 300*6777b538SAndroid Build Coastguard Worker 301*6777b538SAndroid Build Coastguard Worker void SetSocket(std::unique_ptr<StreamSocket> socket, 302*6777b538SAndroid Build Coastguard Worker std::optional<std::set<std::string>> dns_aliases); 303*6777b538SAndroid Build Coastguard Worker void NotifyDelegateOfCompletion(int rv); 304*6777b538SAndroid Build Coastguard Worker void NotifyDelegateOfProxyAuth(const HttpResponseInfo& response, 305*6777b538SAndroid Build Coastguard Worker HttpAuthController* auth_controller, 306*6777b538SAndroid Build Coastguard Worker base::OnceClosure restart_with_auth_callback); 307*6777b538SAndroid Build Coastguard Worker 308*6777b538SAndroid Build Coastguard Worker // If |remaining_time| is base::TimeDelta(), stops the timeout timer, if it's 309*6777b538SAndroid Build Coastguard Worker // running. Otherwise, Starts / restarts the timeout timer to trigger in the 310*6777b538SAndroid Build Coastguard Worker // specified amount of time. 311*6777b538SAndroid Build Coastguard Worker void ResetTimer(base::TimeDelta remaining_time); 312*6777b538SAndroid Build Coastguard Worker 313*6777b538SAndroid Build Coastguard Worker // Returns whether or not the timeout timer is running. Only intended for use 314*6777b538SAndroid Build Coastguard Worker // by DCHECKs. 315*6777b538SAndroid Build Coastguard Worker bool TimerIsRunning() const; 316*6777b538SAndroid Build Coastguard Worker 317*6777b538SAndroid Build Coastguard Worker // Connection establishment timing information. 318*6777b538SAndroid Build Coastguard Worker // TODO(mmenke): This should be private. 319*6777b538SAndroid Build Coastguard Worker LoadTimingInfo::ConnectTiming connect_timing_; 320*6777b538SAndroid Build Coastguard Worker 321*6777b538SAndroid Build Coastguard Worker private: 322*6777b538SAndroid Build Coastguard Worker virtual int ConnectInternal() = 0; 323*6777b538SAndroid Build Coastguard Worker 324*6777b538SAndroid Build Coastguard Worker virtual void ChangePriorityInternal(RequestPriority priority) = 0; 325*6777b538SAndroid Build Coastguard Worker 326*6777b538SAndroid Build Coastguard Worker void LogConnectStart(); 327*6777b538SAndroid Build Coastguard Worker void LogConnectCompletion(int net_error); 328*6777b538SAndroid Build Coastguard Worker 329*6777b538SAndroid Build Coastguard Worker // Alerts the delegate that the ConnectJob has timed out. 330*6777b538SAndroid Build Coastguard Worker void OnTimeout(); 331*6777b538SAndroid Build Coastguard Worker 332*6777b538SAndroid Build Coastguard Worker // Invoked to notify subclasses that the has request timed out. 333*6777b538SAndroid Build Coastguard Worker virtual void OnTimedOutInternal(); 334*6777b538SAndroid Build Coastguard Worker 335*6777b538SAndroid Build Coastguard Worker const base::TimeDelta timeout_duration_; 336*6777b538SAndroid Build Coastguard Worker RequestPriority priority_; 337*6777b538SAndroid Build Coastguard Worker const SocketTag socket_tag_; 338*6777b538SAndroid Build Coastguard Worker raw_ptr<const CommonConnectJobParams> common_connect_job_params_; 339*6777b538SAndroid Build Coastguard Worker // Timer to abort jobs that take too long. 340*6777b538SAndroid Build Coastguard Worker base::OneShotTimer timer_; 341*6777b538SAndroid Build Coastguard Worker raw_ptr<Delegate> delegate_; 342*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> socket_; 343*6777b538SAndroid Build Coastguard Worker // Indicates if this is the topmost ConnectJob. The topmost ConnectJob logs an 344*6777b538SAndroid Build Coastguard Worker // extra begin and end event, to allow callers to log extra data before the 345*6777b538SAndroid Build Coastguard Worker // ConnectJob has started / after it has completed. 346*6777b538SAndroid Build Coastguard Worker const bool top_level_job_; 347*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 348*6777b538SAndroid Build Coastguard Worker // This is called when |this| is deleted. 349*6777b538SAndroid Build Coastguard Worker base::ScopedClosureRunner done_closure_; 350*6777b538SAndroid Build Coastguard Worker const NetLogEventType net_log_connect_event_type_; 351*6777b538SAndroid Build Coastguard Worker }; 352*6777b538SAndroid Build Coastguard Worker 353*6777b538SAndroid Build Coastguard Worker } // namespace net 354*6777b538SAndroid Build Coastguard Worker 355*6777b538SAndroid Build Coastguard Worker #endif // NET_SOCKET_CONNECT_JOB_H_ 356