#ifndef NET_SOCKET_CONNECT_JOB_FACTORY_H_
#define NET_SOCKET_CONNECT_JOB_FACTORY_H_
#include <memory>
#include <optional>
#include <variant>
#include <vector>
#include "net/base/host_port_pair.h"
#include "net/base/network_anonymization_key.h"
#include "net/base/privacy_mode.h"
#include "net/base/request_priority.h"
#include "net/dns/public/secure_dns_policy.h"
#include "net/http/http_proxy_connect_job.h"
#include "net/socket/connect_job.h"
#include "net/socket/socket_tag.h"
#include "net/socket/socks_connect_job.h"
#include "net/socket/ssl_connect_job.h"
#include "net/socket/transport_connect_job.h"
#include "net/ssl/ssl_config.h"
#include "url/scheme_host_port.h"
namespace net {
class NetworkAnonymizationKey;
struct NetworkTrafficAnnotationTag;
class ProxyChain;
struct SSLConfig;
class NET_EXPORT_PRIVATE ConnectJobFactory {
public:
enum class AlpnMode {
kDisabled,
kHttp11Only,
kHttpAll,
};
struct SchemelessEndpoint {
bool using_ssl;
HostPortPair host_port_pair;
};
using Endpoint = std::variant<url::SchemeHostPort, SchemelessEndpoint>;
explicit ConnectJobFactory(
std::unique_ptr<HttpProxyConnectJob::Factory>
http_proxy_connect_job_factory = nullptr,
std::unique_ptr<SOCKSConnectJob::Factory> socks_connect_job_factory =
nullptr,
std::unique_ptr<SSLConnectJob::Factory> ssl_connect_job_factory = nullptr,
std::unique_ptr<TransportConnectJob::Factory>
transport_connect_job_factory = nullptr);
ConnectJobFactory(const ConnectJobFactory&) = delete;
ConnectJobFactory& operator=(const ConnectJobFactory&) = delete;
virtual ~ConnectJobFactory();
std::unique_ptr<ConnectJob> 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
#if BUILDFLAG(ARKWEB_EXT_HTTP_DNS_FALLBACK)
,
bool secure_dns_only = false
#endif
) const;
std::unique_ptr<ConnectJob> 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) const;
private:
virtual std::unique_ptr<ConnectJob> 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
#if BUILDFLAG(ARKWEB_EXT_HTTP_DNS_FALLBACK)
,
bool secure_dns_only = false
#endif
) const;
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_;
net::NetworkAnonymizationKey proxy_dns_network_anonymization_key_ =
net::NetworkAnonymizationKey::CreateTransient();
};
}
#endif