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