xref: /aosp_15_r20/external/cronet/net/socket/connect_job.cc (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 #include "net/socket/connect_job.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <set>
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "net/base/connection_endpoint_metadata.h"
11*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/base/trace_constants.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/tracing.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/host_resolver_results.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_policy.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/http/http_auth_controller.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/http/http_proxy_connect_job.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_event_type.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/socket/client_socket_handle.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_tag.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/socket/socks_connect_job.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/socket/ssl_connect_job.h"
24*6777b538SAndroid Build Coastguard Worker #include "net/socket/stream_socket.h"
25*6777b538SAndroid Build Coastguard Worker #include "net/socket/transport_connect_job.h"
26*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h"
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker namespace net {
29*6777b538SAndroid Build Coastguard Worker 
CommonConnectJobParams(ClientSocketFactory * client_socket_factory,HostResolver * host_resolver,HttpAuthCache * http_auth_cache,HttpAuthHandlerFactory * http_auth_handler_factory,SpdySessionPool * spdy_session_pool,const quic::ParsedQuicVersionVector * quic_supported_versions,QuicSessionPool * quic_session_pool,ProxyDelegate * proxy_delegate,const HttpUserAgentSettings * http_user_agent_settings,SSLClientContext * ssl_client_context,SocketPerformanceWatcherFactory * socket_performance_watcher_factory,NetworkQualityEstimator * network_quality_estimator,NetLog * net_log,WebSocketEndpointLockManager * websocket_endpoint_lock_manager,HttpServerProperties * http_server_properties,const NextProtoVector * alpn_protos,const SSLConfig::ApplicationSettings * application_settings,const bool * ignore_certificate_errors,const bool * enable_early_data)30*6777b538SAndroid Build Coastguard Worker CommonConnectJobParams::CommonConnectJobParams(
31*6777b538SAndroid Build Coastguard Worker     ClientSocketFactory* client_socket_factory,
32*6777b538SAndroid Build Coastguard Worker     HostResolver* host_resolver,
33*6777b538SAndroid Build Coastguard Worker     HttpAuthCache* http_auth_cache,
34*6777b538SAndroid Build Coastguard Worker     HttpAuthHandlerFactory* http_auth_handler_factory,
35*6777b538SAndroid Build Coastguard Worker     SpdySessionPool* spdy_session_pool,
36*6777b538SAndroid Build Coastguard Worker     const quic::ParsedQuicVersionVector* quic_supported_versions,
37*6777b538SAndroid Build Coastguard Worker     QuicSessionPool* quic_session_pool,
38*6777b538SAndroid Build Coastguard Worker     ProxyDelegate* proxy_delegate,
39*6777b538SAndroid Build Coastguard Worker     const HttpUserAgentSettings* http_user_agent_settings,
40*6777b538SAndroid Build Coastguard Worker     SSLClientContext* ssl_client_context,
41*6777b538SAndroid Build Coastguard Worker     SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
42*6777b538SAndroid Build Coastguard Worker     NetworkQualityEstimator* network_quality_estimator,
43*6777b538SAndroid Build Coastguard Worker     NetLog* net_log,
44*6777b538SAndroid Build Coastguard Worker     WebSocketEndpointLockManager* websocket_endpoint_lock_manager,
45*6777b538SAndroid Build Coastguard Worker     HttpServerProperties* http_server_properties,
46*6777b538SAndroid Build Coastguard Worker     const NextProtoVector* alpn_protos,
47*6777b538SAndroid Build Coastguard Worker     const SSLConfig::ApplicationSettings* application_settings,
48*6777b538SAndroid Build Coastguard Worker     const bool* ignore_certificate_errors,
49*6777b538SAndroid Build Coastguard Worker     const bool* enable_early_data)
50*6777b538SAndroid Build Coastguard Worker     : client_socket_factory(client_socket_factory),
51*6777b538SAndroid Build Coastguard Worker       host_resolver(host_resolver),
52*6777b538SAndroid Build Coastguard Worker       http_auth_cache(http_auth_cache),
53*6777b538SAndroid Build Coastguard Worker       http_auth_handler_factory(http_auth_handler_factory),
54*6777b538SAndroid Build Coastguard Worker       spdy_session_pool(spdy_session_pool),
55*6777b538SAndroid Build Coastguard Worker       quic_supported_versions(quic_supported_versions),
56*6777b538SAndroid Build Coastguard Worker       quic_session_pool(quic_session_pool),
57*6777b538SAndroid Build Coastguard Worker       proxy_delegate(proxy_delegate),
58*6777b538SAndroid Build Coastguard Worker       http_user_agent_settings(http_user_agent_settings),
59*6777b538SAndroid Build Coastguard Worker       ssl_client_context(ssl_client_context),
60*6777b538SAndroid Build Coastguard Worker       socket_performance_watcher_factory(socket_performance_watcher_factory),
61*6777b538SAndroid Build Coastguard Worker       network_quality_estimator(network_quality_estimator),
62*6777b538SAndroid Build Coastguard Worker       net_log(net_log),
63*6777b538SAndroid Build Coastguard Worker       websocket_endpoint_lock_manager(websocket_endpoint_lock_manager),
64*6777b538SAndroid Build Coastguard Worker       http_server_properties(http_server_properties),
65*6777b538SAndroid Build Coastguard Worker       alpn_protos(alpn_protos),
66*6777b538SAndroid Build Coastguard Worker       application_settings(application_settings),
67*6777b538SAndroid Build Coastguard Worker       ignore_certificate_errors(ignore_certificate_errors),
68*6777b538SAndroid Build Coastguard Worker       enable_early_data(enable_early_data) {}
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker CommonConnectJobParams::CommonConnectJobParams(
71*6777b538SAndroid Build Coastguard Worker     const CommonConnectJobParams& other) = default;
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker CommonConnectJobParams::~CommonConnectJobParams() = default;
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker CommonConnectJobParams& CommonConnectJobParams::operator=(
76*6777b538SAndroid Build Coastguard Worker     const CommonConnectJobParams& other) = default;
77*6777b538SAndroid Build Coastguard Worker 
ConnectJob(RequestPriority priority,const SocketTag & socket_tag,base::TimeDelta timeout_duration,const CommonConnectJobParams * common_connect_job_params,Delegate * delegate,const NetLogWithSource * net_log,NetLogSourceType net_log_source_type,NetLogEventType net_log_connect_event_type)78*6777b538SAndroid Build Coastguard Worker ConnectJob::ConnectJob(RequestPriority priority,
79*6777b538SAndroid Build Coastguard Worker                        const SocketTag& socket_tag,
80*6777b538SAndroid Build Coastguard Worker                        base::TimeDelta timeout_duration,
81*6777b538SAndroid Build Coastguard Worker                        const CommonConnectJobParams* common_connect_job_params,
82*6777b538SAndroid Build Coastguard Worker                        Delegate* delegate,
83*6777b538SAndroid Build Coastguard Worker                        const NetLogWithSource* net_log,
84*6777b538SAndroid Build Coastguard Worker                        NetLogSourceType net_log_source_type,
85*6777b538SAndroid Build Coastguard Worker                        NetLogEventType net_log_connect_event_type)
86*6777b538SAndroid Build Coastguard Worker     : timeout_duration_(timeout_duration),
87*6777b538SAndroid Build Coastguard Worker       priority_(priority),
88*6777b538SAndroid Build Coastguard Worker       socket_tag_(socket_tag),
89*6777b538SAndroid Build Coastguard Worker       common_connect_job_params_(common_connect_job_params),
90*6777b538SAndroid Build Coastguard Worker       delegate_(delegate),
91*6777b538SAndroid Build Coastguard Worker       top_level_job_(net_log == nullptr),
92*6777b538SAndroid Build Coastguard Worker       net_log_(net_log
93*6777b538SAndroid Build Coastguard Worker                    ? *net_log
94*6777b538SAndroid Build Coastguard Worker                    : NetLogWithSource::Make(common_connect_job_params->net_log,
95*6777b538SAndroid Build Coastguard Worker                                             net_log_source_type)),
96*6777b538SAndroid Build Coastguard Worker       net_log_connect_event_type_(net_log_connect_event_type) {
97*6777b538SAndroid Build Coastguard Worker   DCHECK(delegate);
98*6777b538SAndroid Build Coastguard Worker   if (top_level_job_) {
99*6777b538SAndroid Build Coastguard Worker     net_log_.BeginEvent(NetLogEventType::CONNECT_JOB);
100*6777b538SAndroid Build Coastguard Worker   }
101*6777b538SAndroid Build Coastguard Worker }
102*6777b538SAndroid Build Coastguard Worker 
~ConnectJob()103*6777b538SAndroid Build Coastguard Worker ConnectJob::~ConnectJob() {
104*6777b538SAndroid Build Coastguard Worker   // Log end of Connect event if ConnectJob was still in-progress when
105*6777b538SAndroid Build Coastguard Worker   // destroyed.
106*6777b538SAndroid Build Coastguard Worker   if (delegate_) {
107*6777b538SAndroid Build Coastguard Worker     LogConnectCompletion(ERR_ABORTED);
108*6777b538SAndroid Build Coastguard Worker   }
109*6777b538SAndroid Build Coastguard Worker   if (top_level_job_) {
110*6777b538SAndroid Build Coastguard Worker     net_log().EndEvent(NetLogEventType::CONNECT_JOB);
111*6777b538SAndroid Build Coastguard Worker   }
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker 
PassSocket()114*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> ConnectJob::PassSocket() {
115*6777b538SAndroid Build Coastguard Worker   return std::move(socket_);
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker 
ChangePriority(RequestPriority priority)118*6777b538SAndroid Build Coastguard Worker void ConnectJob::ChangePriority(RequestPriority priority) {
119*6777b538SAndroid Build Coastguard Worker   priority_ = priority;
120*6777b538SAndroid Build Coastguard Worker   ChangePriorityInternal(priority);
121*6777b538SAndroid Build Coastguard Worker }
122*6777b538SAndroid Build Coastguard Worker 
Connect()123*6777b538SAndroid Build Coastguard Worker int ConnectJob::Connect() {
124*6777b538SAndroid Build Coastguard Worker   if (!timeout_duration_.is_zero()) {
125*6777b538SAndroid Build Coastguard Worker     timer_.Start(FROM_HERE, timeout_duration_, this, &ConnectJob::OnTimeout);
126*6777b538SAndroid Build Coastguard Worker   }
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker   LogConnectStart();
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   int rv = ConnectInternal();
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker   if (rv != ERR_IO_PENDING) {
133*6777b538SAndroid Build Coastguard Worker     LogConnectCompletion(rv);
134*6777b538SAndroid Build Coastguard Worker     delegate_ = nullptr;
135*6777b538SAndroid Build Coastguard Worker   }
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker   return rv;
138*6777b538SAndroid Build Coastguard Worker }
139*6777b538SAndroid Build Coastguard Worker 
GetConnectionAttempts() const140*6777b538SAndroid Build Coastguard Worker ConnectionAttempts ConnectJob::GetConnectionAttempts() const {
141*6777b538SAndroid Build Coastguard Worker   // Return empty list by default - used by proxy classes.
142*6777b538SAndroid Build Coastguard Worker   return ConnectionAttempts();
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker 
IsSSLError() const145*6777b538SAndroid Build Coastguard Worker bool ConnectJob::IsSSLError() const {
146*6777b538SAndroid Build Coastguard Worker   return false;
147*6777b538SAndroid Build Coastguard Worker }
148*6777b538SAndroid Build Coastguard Worker 
GetCertRequestInfo()149*6777b538SAndroid Build Coastguard Worker scoped_refptr<SSLCertRequestInfo> ConnectJob::GetCertRequestInfo() {
150*6777b538SAndroid Build Coastguard Worker   return nullptr;
151*6777b538SAndroid Build Coastguard Worker }
152*6777b538SAndroid Build Coastguard Worker 
set_done_closure(base::OnceClosure done_closure)153*6777b538SAndroid Build Coastguard Worker void ConnectJob::set_done_closure(base::OnceClosure done_closure) {
154*6777b538SAndroid Build Coastguard Worker   done_closure_ = base::ScopedClosureRunner(std::move(done_closure));
155*6777b538SAndroid Build Coastguard Worker }
156*6777b538SAndroid Build Coastguard Worker 
157*6777b538SAndroid Build Coastguard Worker std::optional<HostResolverEndpointResult>
GetHostResolverEndpointResult() const158*6777b538SAndroid Build Coastguard Worker ConnectJob::GetHostResolverEndpointResult() const {
159*6777b538SAndroid Build Coastguard Worker   return std::nullopt;
160*6777b538SAndroid Build Coastguard Worker }
161*6777b538SAndroid Build Coastguard Worker 
SetSocket(std::unique_ptr<StreamSocket> socket,std::optional<std::set<std::string>> dns_aliases)162*6777b538SAndroid Build Coastguard Worker void ConnectJob::SetSocket(std::unique_ptr<StreamSocket> socket,
163*6777b538SAndroid Build Coastguard Worker                            std::optional<std::set<std::string>> dns_aliases) {
164*6777b538SAndroid Build Coastguard Worker   if (socket) {
165*6777b538SAndroid Build Coastguard Worker     net_log().AddEventReferencingSource(NetLogEventType::CONNECT_JOB_SET_SOCKET,
166*6777b538SAndroid Build Coastguard Worker                                         socket->NetLog().source());
167*6777b538SAndroid Build Coastguard Worker     if (dns_aliases) {
168*6777b538SAndroid Build Coastguard Worker       socket->SetDnsAliases(std::move(dns_aliases.value()));
169*6777b538SAndroid Build Coastguard Worker     }
170*6777b538SAndroid Build Coastguard Worker   }
171*6777b538SAndroid Build Coastguard Worker   socket_ = std::move(socket);
172*6777b538SAndroid Build Coastguard Worker }
173*6777b538SAndroid Build Coastguard Worker 
NotifyDelegateOfCompletion(int rv)174*6777b538SAndroid Build Coastguard Worker void ConnectJob::NotifyDelegateOfCompletion(int rv) {
175*6777b538SAndroid Build Coastguard Worker   TRACE_EVENT0(NetTracingCategory(), "ConnectJob::NotifyDelegateOfCompletion");
176*6777b538SAndroid Build Coastguard Worker   // The delegate will own |this|.
177*6777b538SAndroid Build Coastguard Worker   Delegate* delegate = delegate_;
178*6777b538SAndroid Build Coastguard Worker   delegate_ = nullptr;
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker   LogConnectCompletion(rv);
181*6777b538SAndroid Build Coastguard Worker   delegate->OnConnectJobComplete(rv, this);
182*6777b538SAndroid Build Coastguard Worker }
183*6777b538SAndroid Build Coastguard Worker 
NotifyDelegateOfProxyAuth(const HttpResponseInfo & response,HttpAuthController * auth_controller,base::OnceClosure restart_with_auth_callback)184*6777b538SAndroid Build Coastguard Worker void ConnectJob::NotifyDelegateOfProxyAuth(
185*6777b538SAndroid Build Coastguard Worker     const HttpResponseInfo& response,
186*6777b538SAndroid Build Coastguard Worker     HttpAuthController* auth_controller,
187*6777b538SAndroid Build Coastguard Worker     base::OnceClosure restart_with_auth_callback) {
188*6777b538SAndroid Build Coastguard Worker   delegate_->OnNeedsProxyAuth(response, auth_controller,
189*6777b538SAndroid Build Coastguard Worker                               std::move(restart_with_auth_callback), this);
190*6777b538SAndroid Build Coastguard Worker }
191*6777b538SAndroid Build Coastguard Worker 
ResetTimer(base::TimeDelta remaining_time)192*6777b538SAndroid Build Coastguard Worker void ConnectJob::ResetTimer(base::TimeDelta remaining_time) {
193*6777b538SAndroid Build Coastguard Worker   timer_.Stop();
194*6777b538SAndroid Build Coastguard Worker   if (!remaining_time.is_zero()) {
195*6777b538SAndroid Build Coastguard Worker     timer_.Start(FROM_HERE, remaining_time, this, &ConnectJob::OnTimeout);
196*6777b538SAndroid Build Coastguard Worker   }
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker 
TimerIsRunning() const199*6777b538SAndroid Build Coastguard Worker bool ConnectJob::TimerIsRunning() const {
200*6777b538SAndroid Build Coastguard Worker   return timer_.IsRunning();
201*6777b538SAndroid Build Coastguard Worker }
202*6777b538SAndroid Build Coastguard Worker 
LogConnectStart()203*6777b538SAndroid Build Coastguard Worker void ConnectJob::LogConnectStart() {
204*6777b538SAndroid Build Coastguard Worker   connect_timing_.connect_start = base::TimeTicks::Now();
205*6777b538SAndroid Build Coastguard Worker   net_log().BeginEvent(net_log_connect_event_type_);
206*6777b538SAndroid Build Coastguard Worker }
207*6777b538SAndroid Build Coastguard Worker 
LogConnectCompletion(int net_error)208*6777b538SAndroid Build Coastguard Worker void ConnectJob::LogConnectCompletion(int net_error) {
209*6777b538SAndroid Build Coastguard Worker   connect_timing_.connect_end = base::TimeTicks::Now();
210*6777b538SAndroid Build Coastguard Worker   net_log().EndEventWithNetErrorCode(net_log_connect_event_type_, net_error);
211*6777b538SAndroid Build Coastguard Worker }
212*6777b538SAndroid Build Coastguard Worker 
OnTimeout()213*6777b538SAndroid Build Coastguard Worker void ConnectJob::OnTimeout() {
214*6777b538SAndroid Build Coastguard Worker   // Make sure the socket is NULL before calling into |delegate|.
215*6777b538SAndroid Build Coastguard Worker   SetSocket(nullptr, std::nullopt /* dns_aliases */);
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   OnTimedOutInternal();
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker   net_log_.AddEvent(NetLogEventType::CONNECT_JOB_TIMED_OUT);
220*6777b538SAndroid Build Coastguard Worker 
221*6777b538SAndroid Build Coastguard Worker   NotifyDelegateOfCompletion(ERR_TIMED_OUT);
222*6777b538SAndroid Build Coastguard Worker }
223*6777b538SAndroid Build Coastguard Worker 
OnTimedOutInternal()224*6777b538SAndroid Build Coastguard Worker void ConnectJob::OnTimedOutInternal() {}
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker }  // namespace net
227