#ifndef NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_
#define NET_URL_REQUEST_URL_REQUEST_HTTP_JOB_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "arkweb/build/features/features.h"
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "net/base/auth.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_error_details.h"
#include "net/base/net_export.h"
#include "net/base/privacy_mode.h"
#include "net/cookies/cookie_inclusion_status.h"
#include "net/cookies/cookie_util.h"
#include "net/first_party_sets/first_party_set_metadata.h"
#include "net/first_party_sets/first_party_sets_cache_filter.h"
#include "net/http/http_request_info.h"
#include "net/socket/connection_attempts.h"
#include "net/url_request/url_request_job.h"
#if BUILDFLAG(ARKWEB_EX_FALLBACK_PROXY)
#if BUILDFLAG(ENABLE_ARKWEB_EXT)
#include "arkweb/ohos_nweb_ex/overrides/net/proxy_resolution/fallback_proxy_utils.h"
#endif
#include "arkweb/chromium_ext/net/proxy_resolution/fallback_proxy_config.h"
#include "net/base/proxy_delegate.h"
#endif
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
#include "net/device_bound_sessions/session_service.h"
#endif
namespace net {
class HttpRequestHeaders;
class HttpResponseHeaders;
class HttpResponseInfo;
class HttpTransaction;
class HttpUserAgentSettings;
class SSLPrivateKey;
struct TransportInfo;
struct LoadTimingInternalInfo;
class UploadDataStream;
class NET_EXPORT_PRIVATE URLRequestHttpJob : public URLRequestJob {
public:
static std::unique_ptr<URLRequestJob> Create(URLRequest* request);
URLRequestHttpJob(const URLRequestHttpJob&) = delete;
URLRequestHttpJob& operator=(const URLRequestHttpJob&) = delete;
void SetRequestHeadersCallback(RequestHeadersCallback callback) override;
void SetEarlyResponseHeadersCallback(
ResponseHeadersCallback callback) override;
void SetResponseHeadersCallback(ResponseHeadersCallback callback) override;
void SetIsSharedDictionaryReadAllowedCallback(
base::RepeatingCallback<bool()> callback) override;
enum class IpProtectionJobResult {
kProtectionNotAttempted = 0,
kProtectionSuccess = 1,
kDirectFallback = 2,
kMaxValue = kDirectFallback,
};
protected:
URLRequestHttpJob(URLRequest* request,
const HttpUserAgentSettings* http_user_agent_settings);
~URLRequestHttpJob() override;
void SetPriority(RequestPriority priority) override;
void Start() override;
void Kill() override;
ConnectionAttempts GetConnectionAttempts() const override;
void CloseConnectionOnDestruction() override;
std::unique_ptr<SourceStream> SetUpSourceStream() override;
RequestPriority priority() const {
return priority_;
}
private:
FRIEND_TEST_ALL_PREFIXES(URLRequestHttpJobTest,
CookieSchemeRequestSchemeHistogram);
enum CompletionCause {
ABORTED,
FINISHED
};
enum class CookieRequestScheme {
kUnsetCookieScheme = 0,
kNonsecureSetNonsecureRequest,
kSecureSetSecureRequest,
kNonsecureSetSecureRequest,
kSecureSetNonsecureRequest,
kMaxValue = kSecureSetNonsecureRequest
};
#if BUILDFLAG(ARKWEB_EXT_HTTP_DNS_FALLBACK)
enum class RetryState {
INIT,
DOH_FALLBACK,
MAX,
};
#endif
typedef base::RefCountedData<bool> SharedBoolean;
void NotifyHeadersComplete();
void DestroyTransaction();
PrivacyMode DeterminePrivacyMode() const;
void AddExtraHeaders();
void AddCookieHeaderAndStart();
void AnnotateAndMoveUserBlockedCookies(
CookieAccessResultList& maybe_included_cookies,
CookieAccessResultList& excluded_cookies) const;
void SaveCookiesAndNotifyHeadersComplete(int result);
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
void ProcessDeviceBoundSessionsHeader();
#endif
void ProcessStrictTransportSecurityHeader();
void OnHeadersReceivedCallback(int result);
void OnStartCompleted(int result);
void OnReadCompleted(int result);
void NotifyBeforeStartTransactionCallback(
int result,
const std::optional<HttpRequestHeaders>& headers);
int NotifyConnectedCallback(const TransportInfo& info,
CompletionOnceCallback callback);
void RestartTransaction();
#if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS)
void RestartTransactionForRefresh(
const device_bound_sessions::SessionService::DeferralParams&
deferral_params,
device_bound_sessions::SessionService::RefreshResult result);
#endif
void RestartTransactionWithAuth(const AuthCredentials& credentials);
void SetUpload(UploadDataStream* upload) override;
void SetExtraRequestHeaders(const HttpRequestHeaders& headers) override;
LoadState GetLoadState() const override;
bool GetMimeType(std::string* mime_type) const override;
bool GetCharset(std::string* charset) override;
void GetClientSideContentDecodingTypes(
std::vector<net::SourceStreamType>* types) const override;
void GetResponseInfo(HttpResponseInfo* info) override;
void GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override;
void PopulateLoadTimingInternalInfo(
LoadTimingInternalInfo* load_timing_internal_info) const override;
bool GetTransactionRemoteEndpoint(IPEndPoint* endpoint) const override;
int GetResponseCode() const override;
void PopulateNetErrorDetails(NetErrorDetails* details) const override;
bool CopyFragmentOnRedirect(const GURL& location) const override;
bool IsSafeRedirect(const GURL& location) override;
bool NeedsAuth() override;
std::unique_ptr<AuthChallengeInfo> GetAuthChallengeInfo() override;
void SetAuth(const AuthCredentials& credentials) override;
void CancelAuth() override;
void ContinueWithCertificate(
scoped_refptr<X509Certificate> client_cert,
scoped_refptr<SSLPrivateKey> client_private_key) override;
void ContinueDespiteLastError() override;
int ReadRawData(IOBuffer* buf, int buf_size) override;
int64_t GetTotalReceivedBytes() const override;
int64_t GetTotalSentBytes() const override;
int64_t GetReceivedBodyBytes() const override;
void DoneReading() override;
void DoneReadingRedirectResponse() override;
void DoneReadingRetryResponse() override;
bool NeedsRetryWithStorageAccess() override;
void SetSharedDictionaryGetter(
SharedDictionaryGetter shared_dictionary_getter) override;
IPEndPoint GetResponseRemoteEndpoint() const override;
void NotifyURLRequestDestroyed() override;
#if BUILDFLAG(ARKWEB_EXT_HTTP_DNS_FALLBACK)
bool CanRetryWithSecureDnsOnly(int net_error);
void RetryWithSecureDnsOnly();
void MaybeRetryWithSecureDnsOnly(int result);
#endif
#if BUILDFLAG(ARKWEB_EX_FALLBACK_PROXY)
bool SupportedHostAndNotUsedSystemProxy(ProxyDelegate* proxy_delegate,
ProxyUnusedReason* unused_reason);
bool MaybeRetryWithFallbackProxy(int& result);
bool CanRetryWithFallbackProxy(int result, ProxyUnusedReason* unused_reason);
void RetryWithFallbackProxy();
SBThreatURLPolicy GetSafeBrowsingThreatUrlPolicy(int result,
int* malicious_type,
int* hw_code);
void RetryWithDirect();
#endif
void RecordTimer();
void ResetTimer();
void StartTransaction();
void MaybeStartTransactionInternal(int result);
void StartTransactionInternal();
void RecordCompletionHistograms(CompletionCause reason);
void DoneWithRequest(CompletionCause reason);
void SetCookieHeaderAndStart(const CookieOptions& options,
const CookieAccessResultList& cookie_list,
const CookieAccessResultList& excluded_list);
void OnSetCookieResult(const CookieOptions& options,
std::optional<CanonicalCookie> cookie,
std::string cookie_string,
CookieAccessResult access_result);
int num_cookie_lines_left_ = 0;
CookieAndLineAccessResultList set_cookie_access_result_list_;
bool ShouldFixMismatchedContentLength(int rv) const;
HttpResponseHeaders* GetResponseHeaders() const;
void OnGotFirstPartySetMetadata(
FirstPartySetMetadata first_party_set_metadata,
FirstPartySetsCacheFilter::MatchInfo match_info);
bool ShouldAddCookieHeader() const;
bool ShouldRecordPartitionedCookieUsage() const;
void MaybeSetSecFetchStorageAccessHeader();
#if BUILDFLAG(ARKWEB_PRP_PRELOAD) && BUILDFLAG(IS_OHOS)
void InitPreloadInfoAndSetToTransaction();
#endif
#if BUILDFLAG(ARKWEB_NETWORK_LOAD)
void ContinueDespiteLastErrorInternal(
scoped_refptr<X509Certificate> client_cert,
scoped_refptr<SSLPrivateKey> client_private_key);
#endif
RequestPriority priority_ = DEFAULT_PRIORITY;
HttpRequestInfo request_info_;
std::unique_ptr<HttpResponseInfo> override_response_info_;
AuthState proxy_auth_state_ = AUTH_STATE_DONT_NEED_AUTH;
AuthState server_auth_state_ = AUTH_STATE_DONT_NEED_AUTH;
AuthCredentials auth_credentials_;
bool read_in_progress_ = false;
std::unique_ptr<HttpTransaction> transaction_;
raw_ptr<const HttpResponseInfo> response_info_ = nullptr;
base::Time request_creation_time_;
bool done_ = false;
base::TimeTicks start_time_;
base::TimeTicks receive_headers_end_;
scoped_refptr<HttpResponseHeaders> override_response_headers_;
std::optional<GURL> preserve_fragment_on_redirect_url_;
bool awaiting_callback_ = false;
raw_ptr<const HttpUserAgentSettings> http_user_agent_settings_;
int64_t total_received_bytes_from_previous_transactions_ = 0;
int64_t total_sent_bytes_from_previous_transactions_ = 0;
RequestHeadersCallback request_headers_callback_;
ResponseHeadersCallback early_response_headers_callback_;
ResponseHeadersCallback response_headers_callback_;
base::RepeatingCallback<bool()> is_shared_dictionary_read_allowed_callback_;
FirstPartySetMetadata first_party_set_metadata_;
#if BUILDFLAG(ARKWEB_EX_HTTP_DNS_FALLBACK) \
|| BUILDFLAG(ARKWEB_EX_FALLBACK_PROXY)
int original_net_error_ = 0;
bool is_retrying_secure_dns_only_{false};
#endif
#if BUILDFLAG(ARKWEB_EXT_HTTP_DNS_FALLBACK)
RetryState state_ = RetryState::INIT;
#endif
#if BUILDFLAG(ARKWEB_EX_FALLBACK_PROXY)
bool wait_for_sb_threat_type_ = false;
bool did_use_fallback_proxy_ = false;
#endif
#if BUILDFLAG(ARKWEB_NETWORK_LOAD)
size_t restarted_ = 0;
#endif
#if BUILDFLAG(ARKWEB_EXT_HTTP_DNS_FALLBACK_ON_DNS_HIJACKING)
bool is_retry_dns_on_dns_hijacking_ = false;
#endif
size_t device_bound_session_deferral_count_ = 0;
base::TimeTicks device_bound_session_first_deferral_;
std::vector<net::SourceStreamType> client_side_content_decoding_types_;
base::WeakPtrFactory<URLRequestHttpJob> weak_factory_{this};
};
}
#endif