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