xref: /aosp_15_r20/external/cronet/net/socket/connect_job_factory.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2021 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_factory.h"
6 
7 #include <memory>
8 #include <optional>
9 #include <utility>
10 #include <vector>
11 
12 #include "base/check.h"
13 #include "base/memory/scoped_refptr.h"
14 #include "net/base/host_port_pair.h"
15 #include "net/base/network_anonymization_key.h"
16 #include "net/base/privacy_mode.h"
17 #include "net/base/proxy_chain.h"
18 #include "net/base/request_priority.h"
19 #include "net/dns/public/secure_dns_policy.h"
20 #include "net/http/http_proxy_connect_job.h"
21 #include "net/socket/connect_job.h"
22 #include "net/socket/connect_job_params_factory.h"
23 #include "net/socket/socket_tag.h"
24 #include "net/socket/socks_connect_job.h"
25 #include "net/socket/ssl_connect_job.h"
26 #include "net/socket/transport_connect_job.h"
27 #include "net/ssl/ssl_config.h"
28 #include "net/traffic_annotation/network_traffic_annotation.h"
29 #include "third_party/abseil-cpp/absl/types/variant.h"
30 #include "url/scheme_host_port.h"
31 
32 namespace net {
33 
34 namespace {
35 
36 template <typename T>
CreateFactoryIfNull(std::unique_ptr<T> in)37 std::unique_ptr<T> CreateFactoryIfNull(std::unique_ptr<T> in) {
38   if (in) {
39     return in;
40   }
41   return std::make_unique<T>();
42 }
43 
44 }  // namespace
45 
ConnectJobFactory(std::unique_ptr<HttpProxyConnectJob::Factory> http_proxy_connect_job_factory,std::unique_ptr<SOCKSConnectJob::Factory> socks_connect_job_factory,std::unique_ptr<SSLConnectJob::Factory> ssl_connect_job_factory,std::unique_ptr<TransportConnectJob::Factory> transport_connect_job_factory)46 ConnectJobFactory::ConnectJobFactory(
47     std::unique_ptr<HttpProxyConnectJob::Factory>
48         http_proxy_connect_job_factory,
49     std::unique_ptr<SOCKSConnectJob::Factory> socks_connect_job_factory,
50     std::unique_ptr<SSLConnectJob::Factory> ssl_connect_job_factory,
51     std::unique_ptr<TransportConnectJob::Factory> transport_connect_job_factory)
52     : http_proxy_connect_job_factory_(
53           CreateFactoryIfNull(std::move(http_proxy_connect_job_factory))),
54       socks_connect_job_factory_(
55           CreateFactoryIfNull(std::move(socks_connect_job_factory))),
56       ssl_connect_job_factory_(
57           CreateFactoryIfNull(std::move(ssl_connect_job_factory))),
58       transport_connect_job_factory_(
59           CreateFactoryIfNull(std::move(transport_connect_job_factory))) {}
60 
61 ConnectJobFactory::~ConnectJobFactory() = default;
62 
CreateConnectJob(url::SchemeHostPort endpoint,const ProxyChain & proxy_chain,const std::optional<NetworkTrafficAnnotationTag> & proxy_annotation_tag,const std::vector<SSLConfig::CertAndStatus> & allowed_bad_certs,ConnectJobFactory::AlpnMode alpn_mode,bool force_tunnel,PrivacyMode privacy_mode,const OnHostResolutionCallback & resolution_callback,RequestPriority request_priority,SocketTag socket_tag,const NetworkAnonymizationKey & network_anonymization_key,SecureDnsPolicy secure_dns_policy,bool disable_cert_network_fetches,const CommonConnectJobParams * common_connect_job_params,ConnectJob::Delegate * delegate) const63 std::unique_ptr<ConnectJob> ConnectJobFactory::CreateConnectJob(
64     url::SchemeHostPort endpoint,
65     const ProxyChain& proxy_chain,
66     const std::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
67     const std::vector<SSLConfig::CertAndStatus>& allowed_bad_certs,
68     ConnectJobFactory::AlpnMode alpn_mode,
69     bool force_tunnel,
70     PrivacyMode privacy_mode,
71     const OnHostResolutionCallback& resolution_callback,
72     RequestPriority request_priority,
73     SocketTag socket_tag,
74     const NetworkAnonymizationKey& network_anonymization_key,
75     SecureDnsPolicy secure_dns_policy,
76     bool disable_cert_network_fetches,
77     const CommonConnectJobParams* common_connect_job_params,
78     ConnectJob::Delegate* delegate) const {
79   return CreateConnectJob(
80       Endpoint(std::move(endpoint)), proxy_chain, proxy_annotation_tag,
81       allowed_bad_certs, alpn_mode, force_tunnel, privacy_mode,
82       resolution_callback, request_priority, socket_tag,
83       network_anonymization_key, secure_dns_policy,
84       disable_cert_network_fetches, common_connect_job_params, delegate);
85 }
86 
CreateConnectJob(bool using_ssl,HostPortPair endpoint,const ProxyChain & proxy_chain,const std::optional<NetworkTrafficAnnotationTag> & proxy_annotation_tag,bool force_tunnel,PrivacyMode privacy_mode,const OnHostResolutionCallback & resolution_callback,RequestPriority request_priority,SocketTag socket_tag,const NetworkAnonymizationKey & network_anonymization_key,SecureDnsPolicy secure_dns_policy,const CommonConnectJobParams * common_connect_job_params,ConnectJob::Delegate * delegate) const87 std::unique_ptr<ConnectJob> ConnectJobFactory::CreateConnectJob(
88     bool using_ssl,
89     HostPortPair endpoint,
90     const ProxyChain& proxy_chain,
91     const std::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
92     bool force_tunnel,
93     PrivacyMode privacy_mode,
94     const OnHostResolutionCallback& resolution_callback,
95     RequestPriority request_priority,
96     SocketTag socket_tag,
97     const NetworkAnonymizationKey& network_anonymization_key,
98     SecureDnsPolicy secure_dns_policy,
99     const CommonConnectJobParams* common_connect_job_params,
100     ConnectJob::Delegate* delegate) const {
101   SchemelessEndpoint schemeless_endpoint{using_ssl, std::move(endpoint)};
102   return CreateConnectJob(
103       std::move(schemeless_endpoint), proxy_chain, proxy_annotation_tag,
104       /*allowed_bad_certs=*/{}, ConnectJobFactory::AlpnMode::kDisabled,
105       force_tunnel, privacy_mode, resolution_callback, request_priority,
106       socket_tag, network_anonymization_key, secure_dns_policy,
107       /*disable_cert_network_fetches=*/false, common_connect_job_params,
108       delegate);
109 }
110 
CreateConnectJob(Endpoint endpoint,const ProxyChain & proxy_chain,const std::optional<NetworkTrafficAnnotationTag> & proxy_annotation_tag,const std::vector<SSLConfig::CertAndStatus> & allowed_bad_certs,ConnectJobFactory::AlpnMode alpn_mode,bool force_tunnel,PrivacyMode privacy_mode,const OnHostResolutionCallback & resolution_callback,RequestPriority request_priority,SocketTag socket_tag,const NetworkAnonymizationKey & network_anonymization_key,SecureDnsPolicy secure_dns_policy,bool disable_cert_network_fetches,const CommonConnectJobParams * common_connect_job_params,ConnectJob::Delegate * delegate) const111 std::unique_ptr<ConnectJob> ConnectJobFactory::CreateConnectJob(
112     Endpoint endpoint,
113     const ProxyChain& proxy_chain,
114     const std::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
115     const std::vector<SSLConfig::CertAndStatus>& allowed_bad_certs,
116     ConnectJobFactory::AlpnMode alpn_mode,
117     bool force_tunnel,
118     PrivacyMode privacy_mode,
119     const OnHostResolutionCallback& resolution_callback,
120     RequestPriority request_priority,
121     SocketTag socket_tag,
122     const NetworkAnonymizationKey& network_anonymization_key,
123     SecureDnsPolicy secure_dns_policy,
124     bool disable_cert_network_fetches,
125     const CommonConnectJobParams* common_connect_job_params,
126     ConnectJob::Delegate* delegate) const {
127   ConnectJobParams connect_job_params = ConstructConnectJobParams(
128       endpoint, proxy_chain, proxy_annotation_tag, allowed_bad_certs, alpn_mode,
129       force_tunnel, privacy_mode, resolution_callback,
130       network_anonymization_key, secure_dns_policy,
131       disable_cert_network_fetches, common_connect_job_params,
132       proxy_dns_network_anonymization_key_);
133 
134   if (connect_job_params.is_ssl()) {
135     return ssl_connect_job_factory_->Create(
136         request_priority, socket_tag, common_connect_job_params,
137         connect_job_params.take_ssl(), delegate, /*net_log=*/nullptr);
138   }
139 
140   if (connect_job_params.is_transport()) {
141     return transport_connect_job_factory_->Create(
142         request_priority, socket_tag, common_connect_job_params,
143         connect_job_params.take_transport(), delegate, /*net_log=*/nullptr);
144   }
145 
146   if (connect_job_params.is_http_proxy()) {
147     return http_proxy_connect_job_factory_->Create(
148         request_priority, socket_tag, common_connect_job_params,
149         connect_job_params.take_http_proxy(), delegate,
150         /*net_log=*/nullptr);
151   }
152 
153   CHECK(connect_job_params.is_socks());
154   return socks_connect_job_factory_->Create(
155       request_priority, socket_tag, common_connect_job_params,
156       connect_job_params.take_socks(), delegate, /*net_log=*/nullptr);
157 }
158 
159 }  // namespace net
160