#ifndef NET_URL_REQUEST_URL_REQUEST_CONTEXT_BUILDER_H_
#define NET_URL_REQUEST_URL_REQUEST_CONTEXT_BUILDER_H_
#include <stdint.h>
#include <map>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "base/check.h"
#include "base/files/file_path.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/task/task_traits.h"
#include "base/types/optional_ref.h"
#include "build/build_config.h"
#include "build/buildflag.h"
#include "components/unexportable_keys/unexportable_key_service.h"
#include "net/base/net_export.h"
#include "net/base/network_delegate.h"
#include "net/base/network_handle.h"
#include "net/base/proxy_delegate.h"
#include "net/disk_cache/buildflags.h"
#include "net/disk_cache/disk_cache.h"
#include "net/dns/host_resolver.h"
#include "net/dns/stale_host_resolver.h"
#include "net/http/http_network_session.h"
#include "net/net_buildflags.h"
#include "net/network_error_logging/network_error_logging_service.h"
#include "net/proxy_resolution/proxy_config_service.h"
#include "net/proxy_resolution/proxy_resolution_service.h"
#include "net/socket/client_socket_factory.h"
#include "net/ssl/ssl_config_service.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h"
#include "net/url_request/url_request_job_factory.h"
namespace net {
class CertVerifier;
class ClientSocketFactory;
class CookieStore;
class HttpAuthHandlerFactory;
class HttpNetworkLayer;
class HttpTransactionFactory;
class HttpUserAgentSettings;
class HttpServerProperties;
class HostResolverManager;
class NetworkQualityEstimator;
class ProxyConfigService;
class URLRequestContext;
#if BUILDFLAG(ENABLE_REPORTING)
struct ReportingPolicy;
class PersistentReportingAndNelStore;
#endif
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
namespace device_bound_sessions {
class SessionService;
}
#endif
class NET_EXPORT URLRequestContextBuilder {
public:
using WrapHttpNetworkLayerCallback =
base::OnceCallback<std::unique_ptr<HttpTransactionFactory>(
std::unique_ptr<HttpNetworkLayer> network_layer)>;
struct NET_EXPORT HttpCacheParams {
enum Type {
IN_MEMORY,
DISK,
DISK_BLOCKFILE,
DISK_SIMPLE,
#if BUILDFLAG(ENABLE_DISK_CACHE_SQL_BACKEND)
DISK_EXPERIMENTAL_SQL,
#endif
};
HttpCacheParams();
~HttpCacheParams();
Type type = IN_MEMORY;
int max_size = 0;
bool reset_cache = false;
base::FilePath path;
base::FilePath no_vary_search_path;
scoped_refptr<disk_cache::BackendFileOperationsFactory>
file_operations_factory;
#if BUILDFLAG(IS_ANDROID)
disk_cache::ApplicationStatusListenerGetter app_status_listener_getter;
#endif
};
URLRequestContextBuilder();
URLRequestContextBuilder(const URLRequestContextBuilder&) = delete;
URLRequestContextBuilder& operator=(const URLRequestContextBuilder&) = delete;
virtual ~URLRequestContextBuilder();
void set_enable_brotli(bool enable_brotli) { enable_brotli_ = enable_brotli; }
void set_enable_zstd(bool enable_zstd) { enable_zstd_ = enable_zstd; }
#if BUILDFLAG(IS_ANDROID)
void enable_stale_dns_resolver(bool stale_dns_enabled) {
stale_dns_enabled_ = stale_dns_enabled;
}
#endif
void set_enable_shared_dictionary(bool enable_shared_dictionary) {
enable_shared_dictionary_ = enable_shared_dictionary;
}
void set_enable_shared_zstd(bool enable_shared_zstd) {
enable_shared_zstd_ = enable_shared_zstd;
}
void set_check_cleartext_permitted(bool value) {
check_cleartext_permitted_ = value;
}
void set_require_network_anonymization_key(bool value) {
require_network_anonymization_key_ = value;
}
void set_network_quality_estimator(
NetworkQualityEstimator* network_quality_estimator) {
network_quality_estimator_ = network_quality_estimator;
}
void set_proxy_config_service(
std::unique_ptr<ProxyConfigService> proxy_config_service) {
proxy_config_service_ = std::move(proxy_config_service);
}
void set_pac_quick_check_enabled(bool pac_quick_check_enabled) {
pac_quick_check_enabled_ = pac_quick_check_enabled;
}
void set_proxy_resolution_service(
std::unique_ptr<ProxyResolutionService> proxy_resolution_service) {
proxy_resolution_service_ = std::move(proxy_resolution_service);
}
void set_ssl_config_service(
std::unique_ptr<SSLConfigService> ssl_config_service) {
ssl_config_service_ = std::move(ssl_config_service);
}
void set_accept_language(const std::string& accept_language);
void set_user_agent(const std::string& user_agent);
void set_http_user_agent_settings(
std::unique_ptr<HttpUserAgentSettings> http_user_agent_settings);
void SetProtocolHandler(
const std::string& scheme,
std::unique_ptr<URLRequestJobFactory::ProtocolHandler> protocol_handler);
void set_net_log(NetLog* net_log) { net_log_ = net_log; }
void set_host_resolver(std::unique_ptr<HostResolver> host_resolver);
void set_host_mapping_rules(std::string host_mapping_rules);
void set_host_resolver_manager(HostResolverManager* manager);
void set_host_resolver_factory(HostResolver::Factory* factory);
template <typename T>
T* set_network_delegate(std::unique_ptr<T> delegate) {
network_delegate_ = std::move(delegate);
return static_cast<T*>(network_delegate_.get());
}
void set_proxy_delegate(std::unique_ptr<ProxyDelegate> proxy_delegate);
void SetHttpAuthHandlerFactory(
std::unique_ptr<HttpAuthHandlerFactory> factory);
void EnableHttpCache(const HttpCacheParams& params);
void DisableHttpCache();
void set_http_network_session_params(
const HttpNetworkSessionParams& http_network_session_params) {
http_network_session_params_ = http_network_session_params;
}
void set_transport_security_persister_file_path(
const base::FilePath& transport_security_persister_file_path) {
transport_security_persister_file_path_ =
transport_security_persister_file_path;
}
void set_hsts_policy_bypass_list(
const std::vector<std::string>& hsts_policy_bypass_list) {
hsts_policy_bypass_list_ = hsts_policy_bypass_list;
}
void SetSpdyAndQuicEnabled(bool spdy_enabled, bool quic_enabled);
void set_sct_auditing_delegate(
std::unique_ptr<SCTAuditingDelegate> sct_auditing_delegate);
void set_quic_context(std::unique_ptr<QuicContext> quic_context);
void SetCertVerifier(std::unique_ptr<CertVerifier> cert_verifier);
#if BUILDFLAG(ENABLE_REPORTING)
void set_reporting_service(
std::unique_ptr<ReportingService> reporting_service);
void set_reporting_policy(std::unique_ptr<ReportingPolicy> reporting_policy);
void set_network_error_logging_enabled(bool network_error_logging_enabled) {
network_error_logging_enabled_ = network_error_logging_enabled;
}
template <typename T>
T* SetNetworkErrorLoggingServiceForTesting(std::unique_ptr<T> service) {
network_error_logging_service_ = std::move(service);
return static_cast<T*>(network_error_logging_service_.get());
}
void set_persistent_reporting_and_nel_store(
std::unique_ptr<PersistentReportingAndNelStore>
persistent_reporting_and_nel_store);
void set_enterprise_reporting_endpoints(
const base::flat_map<std::string, GURL>& enterprise_reporting_endpoints);
#endif
void SetCookieStore(std::unique_ptr<CookieStore> cookie_store);
void SetHttpServerProperties(
std::unique_ptr<HttpServerProperties> http_server_properties);
void SetWrapHttpNetworkLayerCallback(
WrapHttpNetworkLayerCallback wrap_http_network_layer_callback);
template <typename T>
T* SetHttpTransactionFactoryForTesting(std::unique_ptr<T> factory) {
CHECK(!wrap_http_network_layer_callback_);
http_transaction_factory_for_testing_ = std::move(factory);
return static_cast<T*>(http_transaction_factory_for_testing_.get());
}
void set_client_socket_factory_for_testing(
ClientSocketFactory* client_socket_factory_for_testing) {
set_client_socket_factory(client_socket_factory_for_testing);
}
void set_client_socket_factory(
std::unique_ptr<ClientSocketFactory> client_socket_factory) {
set_client_socket_factory(client_socket_factory.get());
client_socket_factory_ = std::move(client_socket_factory);
}
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
void set_device_bound_session_service(
std::unique_ptr<device_bound_sessions::SessionService>
device_bound_session_service);
#endif
void set_has_device_bound_session_service(bool enable) {
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
has_device_bound_session_service_ = enable;
#else
NOTREACHED();
#endif
}
void set_unexportable_key_service(
std::unique_ptr<unexportable_keys::UnexportableKeyService> uks) {
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
unexportable_key_service_ = std::move(uks);
#else
NOTREACHED();
#endif
}
void set_device_bound_sessions_file_path(
const base::FilePath& device_bound_sessions_file_path) {
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
device_bound_sessions_file_path_ = device_bound_sessions_file_path;
#else
NOTREACHED();
#endif
}
void BindToNetwork(
handles::NetworkHandle network,
std::optional<HostResolver::ManagerOptions> options = std::nullopt);
std::unique_ptr<URLRequestContext> Build();
void SuppressSettingSocketPerformanceWatcherFactoryForTesting() {
suppress_setting_socket_performance_watcher_factory_for_testing_ = true;
}
protected:
virtual std::unique_ptr<ProxyResolutionService> CreateProxyResolutionService(
std::unique_ptr<ProxyConfigService> proxy_config_service,
URLRequestContext* url_request_context,
HostResolver* host_resolver,
NetworkDelegate* network_delegate,
NetLog* net_log,
bool pac_quick_check_enabled);
private:
static void SetHttpNetworkSessionComponents(
const URLRequestContext* request_context,
HttpNetworkSessionContext* session_context,
bool suppress_setting_socket_performance_watcher_factory = false,
ClientSocketFactory* client_socket_factory = nullptr);
void set_client_socket_factory(ClientSocketFactory* client_socket_factory) {
client_socket_factory_raw_ = client_socket_factory;
}
bool enable_brotli_ = false;
bool enable_zstd_ = false;
bool enable_shared_dictionary_ = false;
bool enable_shared_zstd_ = false;
bool check_cleartext_permitted_ = false;
bool require_network_anonymization_key_ = false;
raw_ptr<NetworkQualityEstimator> network_quality_estimator_ = nullptr;
std::string accept_language_;
std::string user_agent_;
std::unique_ptr<HttpUserAgentSettings> http_user_agent_settings_;
bool http_cache_enabled_ = true;
bool cookie_store_set_by_client_ = false;
bool suppress_setting_socket_performance_watcher_factory_for_testing_ = false;
bool stale_dns_enabled_ = false;
handles::NetworkHandle bound_network_ = handles::kInvalidNetworkHandle;
HostResolver::ManagerOptions manager_options_;
HttpCacheParams http_cache_params_;
HttpNetworkSessionParams http_network_session_params_;
WrapHttpNetworkLayerCallback wrap_http_network_layer_callback_;
std::unique_ptr<HttpTransactionFactory> http_transaction_factory_for_testing_;
base::FilePath transport_security_persister_file_path_;
std::vector<std::string> hsts_policy_bypass_list_;
raw_ptr<NetLog> net_log_ = nullptr;
std::unique_ptr<HostResolver> host_resolver_;
std::string host_mapping_rules_;
raw_ptr<HostResolverManager> host_resolver_manager_ = nullptr;
raw_ptr<HostResolver::Factory> host_resolver_factory_ = nullptr;
std::unique_ptr<ProxyConfigService> proxy_config_service_;
bool pac_quick_check_enabled_ = true;
std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
std::unique_ptr<SSLConfigService> ssl_config_service_;
std::unique_ptr<NetworkDelegate> network_delegate_;
std::unique_ptr<ProxyDelegate> proxy_delegate_;
std::unique_ptr<CookieStore> cookie_store_;
std::unique_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_;
std::unique_ptr<CertVerifier> cert_verifier_;
std::unique_ptr<SCTAuditingDelegate> sct_auditing_delegate_;
std::unique_ptr<QuicContext> quic_context_;
std::unique_ptr<ClientSocketFactory> client_socket_factory_ = nullptr;
#if BUILDFLAG(ENABLE_REPORTING)
std::unique_ptr<ReportingService> reporting_service_;
std::unique_ptr<ReportingPolicy> reporting_policy_;
bool network_error_logging_enabled_ = false;
std::unique_ptr<NetworkErrorLoggingService> network_error_logging_service_;
std::unique_ptr<PersistentReportingAndNelStore>
persistent_reporting_and_nel_store_;
base::flat_map<std::string, GURL> enterprise_reporting_endpoints_ = {};
#endif
std::unique_ptr<HttpServerProperties> http_server_properties_;
std::map<std::string, std::unique_ptr<URLRequestJobFactory::ProtocolHandler>>
protocol_handlers_;
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
bool has_device_bound_session_service_ = false;
std::unique_ptr<unexportable_keys::UnexportableKeyService>
unexportable_key_service_;
std::unique_ptr<device_bound_sessions::SessionService>
device_bound_session_service_;
base::FilePath device_bound_sessions_file_path_;
#endif
raw_ptr<ClientSocketFactory> client_socket_factory_raw_ = nullptr;
};
}
#endif