#include "third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_sender.h"
#include <utility>
#include "base/compiler_specific.h"
#include "base/debug/alias.h"
#include "base/files/file_path.h"
#include "base/functional/bind.h"
#include "base/functional/callback_forward.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/ranges/algorithm.h"
#include "base/strings/string_util.h"
#include "base/synchronization/waitable_event.h"
#include "base/task/single_thread_task_runner.h"
#include "base/task/thread_pool.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "net/base/load_flags.h"
#include "net/base/net_errors.h"
#include "net/base/request_priority.h"
#include "net/http/http_response_headers.h"
#include "net/url_request/referrer_policy.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/is_potentially_trustworthy.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/url_loader_completion_status.h"
#include "services/network/public/cpp/url_util.h"
#include "services/network/public/mojom/fetch_api.mojom.h"
#include "services/network/public/mojom/url_response_head.mojom.h"
#include "third_party/blink/public/common/client_hints/client_hints.h"
#include "third_party/blink/public/common/loader/inter_process_time_ticks_converter.h"
#include "third_party/blink/public/common/loader/referrer_utils.h"
#include "third_party/blink/public/common/loader/resource_type_util.h"
#include "third_party/blink/public/common/loader/throttling_url_loader.h"
#include "third_party/blink/public/mojom/loader/code_cache.mojom-blink.h"
#include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h"
#include "third_party/blink/public/mojom/navigation/renderer_eviction_reason.mojom-blink.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/public/platform/web_url_request_util.h"
#include "third_party/blink/renderer/platform/loader/fetch/code_cache_host.h"
#include "third_party/blink/renderer/platform/loader/fetch/fetch_utils.h"
#include "third_party/blink/renderer/platform/loader/fetch/url_loader/code_cache_fetcher.h"
#include "third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.h"
#include "third_party/blink/renderer/platform/loader/fetch/url_loader/resource_request_client.h"
#include "third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.h"
#include "third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_response.h"
#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
#include "third_party/blink/renderer/platform/weborigin/scheme_registry.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_mojo.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_std.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
#include "third_party/blink/renderer/platform/wtf/ref_counted.h"
namespace WTF {
template <>
struct CrossThreadCopier<
blink::WebVector<std::unique_ptr<blink::URLLoaderThrottle>>> { … };
template <>
struct CrossThreadCopier<net::NetworkTrafficAnnotationTag>
: public CrossThreadCopierPassThrough<net::NetworkTrafficAnnotationTag> { … };
template <>
struct CrossThreadCopier<blink::WebVector<blink::WebString>>
: public CrossThreadCopierPassThrough<blink::WebVector<blink::WebString>> { … };
}
namespace blink {
namespace {
#if BUILDFLAG(IS_WIN)
void RemoteToLocalTimeTicks(const InterProcessTimeTicksConverter& converter,
base::TimeTicks* time) {
RemoteTimeTicks remote_time = RemoteTimeTicks::FromTimeTicks(*time);
*time = converter.ToLocalTimeTicks(remote_time).ToTimeTicks();
}
#endif
void CheckSchemeForReferrerPolicy(const network::ResourceRequest& request) { … }
bool RedirectRequiresLoaderRestart(const GURL& original_url,
const GURL& redirect_url) { … }
}
ResourceRequestSender::ResourceRequestSender() = default;
ResourceRequestSender::~ResourceRequestSender() = default;
void ResourceRequestSender::SendSync(
std::unique_ptr<network::ResourceRequest> request,
const net::NetworkTrafficAnnotationTag& traffic_annotation,
uint32_t loader_options,
SyncLoadResponse* response,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
WebVector<std::unique_ptr<URLLoaderThrottle>> throttles,
base::TimeDelta timeout,
const Vector<String>& cors_exempt_header_list,
base::WaitableEvent* terminate_sync_load_event,
mojo::PendingRemote<mojom::blink::BlobRegistry> download_to_blob_registry,
scoped_refptr<ResourceRequestClient> client,
std::unique_ptr<ResourceLoadInfoNotifierWrapper>
resource_load_info_notifier_wrapper) { … }
int ResourceRequestSender::SendAsync(
std::unique_ptr<network::ResourceRequest> request,
scoped_refptr<base::SequencedTaskRunner> loading_task_runner,
const net::NetworkTrafficAnnotationTag& traffic_annotation,
uint32_t loader_options,
const Vector<String>& cors_exempt_header_list,
scoped_refptr<ResourceRequestClient> client,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
WebVector<std::unique_ptr<URLLoaderThrottle>> throttles,
std::unique_ptr<ResourceLoadInfoNotifierWrapper>
resource_load_info_notifier_wrapper,
CodeCacheHost* code_cache_host,
base::OnceCallback<void(mojom::blink::RendererEvictionReason)>
evict_from_bfcache_callback,
base::RepeatingCallback<void(size_t)>
did_buffer_load_while_in_bfcache_callback) { … }
void ResourceRequestSender::Cancel(
scoped_refptr<base::SequencedTaskRunner> task_runner) { … }
void ResourceRequestSender::Freeze(LoaderFreezeMode mode) { … }
void ResourceRequestSender::DidChangePriority(net::RequestPriority new_priority,
int intra_priority_value) { … }
void ResourceRequestSender::DeletePendingRequest(
scoped_refptr<base::SequencedTaskRunner> task_runner) { … }
ResourceRequestSender::PendingRequestInfo::PendingRequestInfo(
scoped_refptr<ResourceRequestClient> client,
network::mojom::RequestDestination request_destination,
const KURL& request_url,
std::unique_ptr<ResourceLoadInfoNotifierWrapper>
resource_load_info_notifier_wrapper)
: … { … }
ResourceRequestSender::PendingRequestInfo::~PendingRequestInfo() = default;
void ResourceRequestSender::FollowPendingRedirect(
PendingRequestInfo* request_info) { … }
void ResourceRequestSender::OnTransferSizeUpdated(int32_t transfer_size_diff) { … }
void ResourceRequestSender::OnUploadProgress(int64_t position, int64_t size) { … }
void ResourceRequestSender::OnReceivedResponse(
network::mojom::URLResponseHeadPtr response_head,
mojo::ScopedDataPipeConsumerHandle body,
std::optional<mojo_base::BigBuffer> cached_metadata,
base::TimeTicks response_ipc_arrival_time) { … }
void ResourceRequestSender::OnReceivedRedirect(
const net::RedirectInfo& redirect_info,
network::mojom::URLResponseHeadPtr response_head,
base::TimeTicks redirect_ipc_arrival_time) { … }
void ResourceRequestSender::OnFollowRedirectCallback(
const net::RedirectInfo& redirect_info,
network::mojom::URLResponseHeadPtr response_head,
std::vector<std::string> removed_headers,
net::HttpRequestHeaders modified_headers) { … }
void ResourceRequestSender::OnRequestComplete(
const network::URLLoaderCompletionStatus& status,
base::TimeTicks complete_ipc_arrival_time) { … }
base::TimeTicks ResourceRequestSender::ToLocalURLResponseHead(
const PendingRequestInfo& request_info,
network::mojom::URLResponseHead& response_head) const { … }
void ResourceRequestSender::DidReceiveCachedCode() { … }
bool ResourceRequestSender::ShouldDeferTask() const { … }
void ResourceRequestSender::MaybeRunPendingTasks() { … }
}