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