#ifndef NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_
#define NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/threading/thread_checker.h"
#include "base/types/pass_key.h"
#include "build/build_config.h"
#include "net/base/net_export.h"
#include "net/base/network_handle.h"
#include "net/base/request_priority.h"
#include "net/log/net_log_source.h"
#include "net/net_buildflags.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/url_request/url_request.h"
#if BUILDFLAG(ENABLE_ARKWEB_EXT)
#include "arkweb/ohos_nweb_ex/build/features/features.h"
#endif
namespace unexportable_keys {
class UnexportableKeyService;
}
namespace net {
class CertVerifier;
class ClientSocketFactory;
class CookieStore;
class HostResolver;
class HttpAuthHandlerFactory;
class HttpNetworkSession;
struct HttpNetworkSessionContext;
struct HttpNetworkSessionParams;
class HttpServerProperties;
class HttpTransactionFactory;
class HttpUserAgentSettings;
class NetLog;
class NetworkDelegate;
class NetworkQualityEstimator;
class ProxyDelegate;
class ProxyResolutionService;
class QuicContext;
class SCTAuditingDelegate;
class SSLConfigService;
class TransportSecurityPersister;
class TransportSecurityState;
class URLRequest;
class URLRequestJobFactory;
class URLRequestContextBuilder;
class URLRequestContextExt;
#if BUILDFLAG(ENABLE_REPORTING)
class NetworkErrorLoggingService;
class PersistentReportingAndNelStore;
class ReportingService;
#endif
namespace device_bound_sessions {
class SessionService;
class SessionStore;
}
class NET_EXPORT URLRequestContext {
public:
friend class URLRequestContextExt;
explicit URLRequestContext(base::PassKey<URLRequestContextBuilder> pass_key);
URLRequestContext(const URLRequestContext&) = delete;
URLRequestContext& operator=(const URLRequestContext&) = delete;
virtual ~URLRequestContext();
virtual URLRequestContextExt* AsURLRequestContextExt() {
return nullptr;
}
const HttpNetworkSessionParams* GetNetworkSessionParams() const;
const HttpNetworkSessionContext* GetNetworkSessionContext() const;
#if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_LINUX)
std::unique_ptr<URLRequest> CreateRequest(
const GURL& url,
RequestPriority priority,
URLRequest::Delegate* delegate) const;
#endif
std::unique_ptr<URLRequest> CreateRequest(
const GURL& url,
RequestPriority priority,
URLRequest::Delegate* delegate,
NetworkTrafficAnnotationTag traffic_annotation,
bool is_for_websockets = false,
const std::optional<net::NetLogSource> net_log_source =
std::nullopt) const;
#if BUILDFLAG(ARKWEB_PRP_PRELOAD)
std::shared_ptr<URLRequest> CreateRequestForPrpp(
const GURL& url,
RequestPriority priority,
URLRequest::Delegate* delegate,
NetworkTrafficAnnotationTag traffic_annotation,
bool is_for_websockets = false,
const absl::optional<net::NetLogSource> net_log_source =
absl::nullopt) const;
#endif
NetLog* net_log() const { return net_log_; }
HostResolver* host_resolver() const { return host_resolver_.get(); }
CertVerifier* cert_verifier() const { return cert_verifier_.get(); }
ProxyResolutionService* proxy_resolution_service() const {
return proxy_resolution_service_.get();
}
ProxyDelegate* proxy_delegate() const { return proxy_delegate_.get(); }
SSLConfigService* ssl_config_service() const {
return ssl_config_service_.get();
}
HttpAuthHandlerFactory* http_auth_handler_factory() const {
return http_auth_handler_factory_.get();
}
HttpTransactionFactory* http_transaction_factory() const {
return http_transaction_factory_.get();
}
NetworkDelegate* network_delegate() const { return network_delegate_.get(); }
HttpServerProperties* http_server_properties() const {
return http_server_properties_.get();
}
CookieStore* cookie_store() const { return cookie_store_.get(); }
TransportSecurityState* transport_security_state() const {
return transport_security_state_.get();
}
SCTAuditingDelegate* sct_auditing_delegate() const {
return sct_auditing_delegate_.get();
}
const URLRequestJobFactory* job_factory() const { return job_factory_; }
QuicContext* quic_context() const { return quic_context_.get(); }
std::set<raw_ptr<const URLRequest, SetExperimental>>* url_requests() const {
return url_requests_.get();
}
void AssertNoURLRequests() const;
const HttpUserAgentSettings* http_user_agent_settings() const {
return http_user_agent_settings_.get();
}
NetworkQualityEstimator* network_quality_estimator() const {
return network_quality_estimator_.get();
}
#if BUILDFLAG(ENABLE_REPORTING)
ReportingService* reporting_service() const {
return reporting_service_.get();
}
NetworkErrorLoggingService* network_error_logging_service() const {
return network_error_logging_service_.get();
}
#endif
device_bound_sessions::SessionStore* device_bound_session_store() const {
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
return device_bound_session_store_.get();
#else
return nullptr;
#endif
}
unexportable_keys::UnexportableKeyService* unexportable_key_service() const {
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
return unexportable_key_service_.get();
#else
return nullptr;
#endif
}
device_bound_sessions::SessionService* device_bound_session_service() const {
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
return device_bound_session_service_.get();
#else
return nullptr;
#endif
}
bool enable_brotli() const { return enable_brotli_; }
bool enable_zstd() const { return enable_zstd_; }
bool check_cleartext_permitted() const { return check_cleartext_permitted_; }
bool require_network_anonymization_key() const {
return require_network_anonymization_key_;
}
handles::NetworkHandle bound_network() const { return bound_network_; }
void AssertCalledOnValidThread() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
}
void SetJobFactoryForTesting(const URLRequestJobFactory* job_factory) {
job_factory_ = job_factory;
}
#if BUILDFLAG(ARKWEB_PRP_PRELOAD)
base::WeakPtr<URLRequestContext> GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
#endif
#if BUILDFLAG(ARKWEB_TEST)
public:
#else
private:
#endif
friend class URLRequestContextBuilder;
HttpNetworkSession* http_network_session() const {
return http_network_session_.get();
}
void set_net_log(NetLog* net_log);
void set_host_resolver(std::unique_ptr<HostResolver> host_resolver);
void set_cert_verifier(std::unique_ptr<CertVerifier> cert_verifier);
void set_proxy_resolution_service(
std::unique_ptr<ProxyResolutionService> proxy_resolution_service);
void set_proxy_delegate(std::unique_ptr<ProxyDelegate> proxy_delegate);
void set_ssl_config_service(std::unique_ptr<SSLConfigService> service);
void set_http_auth_handler_factory(
std::unique_ptr<HttpAuthHandlerFactory> factory);
void set_http_network_session(
std::unique_ptr<HttpNetworkSession> http_network_session);
void set_http_transaction_factory(
std::unique_ptr<HttpTransactionFactory> factory);
void set_network_delegate(std::unique_ptr<NetworkDelegate> network_delegate);
void set_http_server_properties(
std::unique_ptr<HttpServerProperties> http_server_properties);
void set_cookie_store(std::unique_ptr<CookieStore> cookie_store);
void set_transport_security_state(
std::unique_ptr<TransportSecurityState> state);
void set_sct_auditing_delegate(std::unique_ptr<SCTAuditingDelegate> delegate);
void set_job_factory(std::unique_ptr<const URLRequestJobFactory> job_factory);
void set_quic_context(std::unique_ptr<QuicContext> quic_context);
void set_http_user_agent_settings(
std::unique_ptr<const HttpUserAgentSettings> http_user_agent_settings);
void set_network_quality_estimator(
NetworkQualityEstimator* network_quality_estimator);
void set_client_socket_factory(
std::unique_ptr<ClientSocketFactory> client_socket_factory);
#if BUILDFLAG(ENABLE_REPORTING)
void set_persistent_reporting_and_nel_store(
std::unique_ptr<PersistentReportingAndNelStore>
persistent_reporting_and_nel_store);
void set_reporting_service(
std::unique_ptr<ReportingService> reporting_service);
void set_network_error_logging_service(
std::unique_ptr<NetworkErrorLoggingService>
network_error_logging_service);
#endif
void set_enable_brotli(bool enable_brotli) { enable_brotli_ = enable_brotli; }
void set_enable_zstd(bool enable_zstd) { enable_zstd_ = enable_zstd; }
void set_check_cleartext_permitted(bool check_cleartext_permitted) {
check_cleartext_permitted_ = check_cleartext_permitted;
}
void set_require_network_anonymization_key(
bool require_network_anonymization_key) {
require_network_anonymization_key_ = require_network_anonymization_key;
}
void set_bound_network(handles::NetworkHandle network) {
bound_network_ = network;
}
void set_transport_security_persister(
std::unique_ptr<TransportSecurityPersister> transport_security_persister);
raw_ptr<NetLog> net_log_ = nullptr;
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
void set_device_bound_session_store(
std::unique_ptr<device_bound_sessions::SessionStore>
device_bound_session_store);
void set_device_bound_session_service(
std::unique_ptr<device_bound_sessions::SessionService>
device_bound_session_service);
void set_unexportable_key_service(
std::unique_ptr<unexportable_keys::UnexportableKeyService>
unexportable_key_service);
#endif
std::unique_ptr<HostResolver> host_resolver_;
std::unique_ptr<CertVerifier> cert_verifier_;
std::unique_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_;
std::unique_ptr<NetworkDelegate> network_delegate_;
std::unique_ptr<ProxyDelegate> proxy_delegate_;
std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
std::unique_ptr<SSLConfigService> ssl_config_service_;
std::unique_ptr<HttpServerProperties> http_server_properties_;
std::unique_ptr<const HttpUserAgentSettings> http_user_agent_settings_;
std::unique_ptr<CookieStore> cookie_store_;
std::unique_ptr<TransportSecurityState> transport_security_state_;
std::unique_ptr<SCTAuditingDelegate> sct_auditing_delegate_;
std::unique_ptr<QuicContext> quic_context_;
std::unique_ptr<ClientSocketFactory> client_socket_factory_;
std::unique_ptr<const URLRequestJobFactory> job_factory_storage_;
raw_ptr<const URLRequestJobFactory> job_factory_ = nullptr;
#if BUILDFLAG(ENABLE_REPORTING)
std::unique_ptr<PersistentReportingAndNelStore>
persistent_reporting_and_nel_store_;
std::unique_ptr<ReportingService> reporting_service_;
std::unique_ptr<NetworkErrorLoggingService> network_error_logging_service_;
#endif
std::unique_ptr<HttpNetworkSession> http_network_session_;
std::unique_ptr<HttpTransactionFactory> http_transaction_factory_;
raw_ptr<NetworkQualityEstimator> network_quality_estimator_ = nullptr;
std::unique_ptr<TransportSecurityPersister> transport_security_persister_;
std::unique_ptr<std::set<raw_ptr<const URLRequest, SetExperimental>>>
url_requests_;
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
std::unique_ptr<unexportable_keys::UnexportableKeyService>
unexportable_key_service_;
std::unique_ptr<device_bound_sessions::SessionStore>
device_bound_session_store_;
std::unique_ptr<device_bound_sessions::SessionService>
device_bound_session_service_;
#endif
bool enable_brotli_ = false;
bool enable_zstd_ = false;
bool check_cleartext_permitted_ = false;
bool require_network_anonymization_key_ = false;
handles::NetworkHandle bound_network_;
THREAD_CHECKER(thread_checker_);
#if BUILDFLAG(ARKWEB_PRP_PRELOAD)
base::WeakPtrFactory<URLRequestContext> weak_factory_{this};
#endif
};
}
#endif