xref: /aosp_15_r20/external/cronet/net/socket/connect_job.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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