• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef NET_SOCKET_CONNECT_JOB_FACTORY_H_
6 #define NET_SOCKET_CONNECT_JOB_FACTORY_H_
7 
8 #include <memory>
9 
10 #include "net/base/host_port_pair.h"
11 #include "net/base/network_anonymization_key.h"
12 #include "net/base/privacy_mode.h"
13 #include "net/base/request_priority.h"
14 #include "net/dns/public/secure_dns_policy.h"
15 #include "net/http/http_proxy_connect_job.h"
16 #include "net/socket/connect_job.h"
17 #include "net/socket/socket_tag.h"
18 #include "net/socket/socks_connect_job.h"
19 #include "net/socket/ssl_connect_job.h"
20 #include "net/socket/transport_connect_job.h"
21 #include "third_party/abseil-cpp/absl/types/optional.h"
22 #include "third_party/abseil-cpp/absl/types/variant.h"
23 #include "url/scheme_host_port.h"
24 
25 namespace net {
26 
27 class NetworkAnonymizationKey;
28 struct NetworkTrafficAnnotationTag;
29 class ProxyChain;
30 struct SSLConfig;
31 
32 // Common factory for all ConnectJob types. Determines and creates the correct
33 // ConnectJob depending on the passed in parameters.
34 class NET_EXPORT_PRIVATE ConnectJobFactory {
35  public:
36   // The endpoint of a connection when the endpoint does not have a known
37   // standard scheme.
38   struct SchemelessEndpoint {
39     bool using_ssl;
40     HostPortPair host_port_pair;
41   };
42 
43   // Representation of the endpoint of a connection. Could be schemeful or
44   // schemeless.
45   using Endpoint = absl::variant<url::SchemeHostPort, SchemelessEndpoint>;
46 
47   // Default factory will be used if passed the default `nullptr`.
48   explicit ConnectJobFactory(
49       std::unique_ptr<HttpProxyConnectJob::Factory>
50           http_proxy_connect_job_factory = nullptr,
51       std::unique_ptr<SOCKSConnectJob::Factory> socks_connect_job_factory =
52           nullptr,
53       std::unique_ptr<SSLConnectJob::Factory> ssl_connect_job_factory = nullptr,
54       std::unique_ptr<TransportConnectJob::Factory>
55           transport_connect_job_factory = nullptr);
56 
57   // Not copyable/movable. Intended for polymorphic use via pointer.
58   ConnectJobFactory(const ConnectJobFactory&) = delete;
59   ConnectJobFactory& operator=(const ConnectJobFactory&) = delete;
60 
61   virtual ~ConnectJobFactory();
62 
63   // `common_connect_job_params` and `delegate` must outlive the returned
64   // ConnectJob.
65   std::unique_ptr<ConnectJob> CreateConnectJob(
66       url::SchemeHostPort endpoint,
67       const ProxyChain& proxy_chain,
68       const absl::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
69       const SSLConfig* ssl_config_for_origin,
70       const SSLConfig* base_ssl_config_for_proxies,
71       bool force_tunnel,
72       PrivacyMode privacy_mode,
73       const OnHostResolutionCallback& resolution_callback,
74       RequestPriority request_priority,
75       SocketTag socket_tag,
76       const NetworkAnonymizationKey& network_anonymization_key,
77       SecureDnsPolicy secure_dns_policy,
78       const CommonConnectJobParams* common_connect_job_params,
79       ConnectJob::Delegate* delegate) const;
80 
81   // TODO(crbug.com/1206799): Rename to discourage use except in cases where the
82   // scheme is non-standard or unknown.
83   std::unique_ptr<ConnectJob> CreateConnectJob(
84       bool using_ssl,
85       HostPortPair endpoint,
86       const ProxyChain& proxy_chain,
87       const absl::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
88       const SSLConfig* ssl_config_for_origin,
89       const SSLConfig* base_ssl_config_for_proxies,
90       bool force_tunnel,
91       PrivacyMode privacy_mode,
92       const OnHostResolutionCallback& resolution_callback,
93       RequestPriority request_priority,
94       SocketTag socket_tag,
95       const NetworkAnonymizationKey& network_anonymization_key,
96       SecureDnsPolicy secure_dns_policy,
97       const CommonConnectJobParams* common_connect_job_params,
98       ConnectJob::Delegate* delegate) const;
99 
100  private:
101   virtual std::unique_ptr<ConnectJob> CreateConnectJob(
102       Endpoint endpoint,
103       const ProxyChain& proxy_chain,
104       const absl::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
105       const SSLConfig* ssl_config_for_origin,
106       const SSLConfig* base_ssl_config_for_proxies,
107       bool force_tunnel,
108       PrivacyMode privacy_mode,
109       const OnHostResolutionCallback& resolution_callback,
110       RequestPriority request_priority,
111       SocketTag socket_tag,
112       const NetworkAnonymizationKey& network_anonymization_key,
113       SecureDnsPolicy secure_dns_policy,
114       const CommonConnectJobParams* common_connect_job_params,
115       ConnectJob::Delegate* delegate) const;
116 
117   std::unique_ptr<HttpProxyConnectJob::Factory> http_proxy_connect_job_factory_;
118   std::unique_ptr<SOCKSConnectJob::Factory> socks_connect_job_factory_;
119   std::unique_ptr<SSLConnectJob::Factory> ssl_connect_job_factory_;
120   std::unique_ptr<TransportConnectJob::Factory> transport_connect_job_factory_;
121 
122   // Use a single NetworkAnonymizationKey for looking up proxy hostnames.
123   // Proxies are typically used across sites, but cached proxy IP addresses
124   // don't really expose useful information to destination sites, and not
125   // caching them has a performance cost.
126   net::NetworkAnonymizationKey proxy_dns_network_anonymization_key_ =
127       net::NetworkAnonymizationKey::CreateTransient();
128 };
129 
130 }  // namespace net
131 
132 #endif  // NET_SOCKET_CONNECT_JOB_FACTORY_H_
133