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