#include "content/browser/web_package/signed_exchange_loader.h"
#include <memory>
#include <optional>
#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/metrics/histogram_macros.h"
#include "components/web_package/web_bundle_utils.h"
#include "content/browser/web_package/prefetched_signed_exchange_cache_entry.h"
#include "content/browser/web_package/signed_exchange_cert_fetcher_factory.h"
#include "content/browser/web_package/signed_exchange_devtools_proxy.h"
#include "content/browser/web_package/signed_exchange_handler.h"
#include "content/browser/web_package/signed_exchange_reporter.h"
#include "content/browser/web_package/signed_exchange_utils.h"
#include "content/public/common/content_features.h"
#include "net/base/load_flags.h"
#include "net/base/net_errors.h"
#include "net/cert/cert_status_flags.h"
#include "net/http/http_util.h"
#include "net/url_request/redirect_util.h"
#include "services/network/public/cpp/constants.h"
#include "services/network/public/cpp/data_pipe_to_source_stream.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/is_potentially_trustworthy.h"
#include "services/network/public/cpp/record_ontransfersizeupdate_utils.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/source_stream_to_data_pipe.h"
#include "services/network/public/cpp/url_loader_completion_status.h"
#include "services/network/public/mojom/early_hints.mojom.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "services/network/public/mojom/url_response_head.mojom.h"
#include "third_party/blink/public/common/web_package/web_package_request_matcher.h"
#include "url/origin.h"
namespace content {
namespace {
constexpr char kPrefetchLoadResultHistogram[] = …;
SignedExchangeHandlerFactory* g_signed_exchange_factory_for_testing_ = …;
net::IsolationInfo CreateIsolationInfoForCertFetch(
const network::ResourceRequest& outer_request) { … }
}
SignedExchangeLoader::SignedExchangeLoader(
const network::ResourceRequest& outer_request,
network::mojom::URLResponseHeadPtr outer_response_head,
mojo::ScopedDataPipeConsumerHandle outer_response_body,
mojo::PendingRemote<network::mojom::URLLoaderClient> forwarding_client,
network::mojom::URLLoaderClientEndpointsPtr endpoints,
uint32_t url_loader_options,
bool should_redirect_on_failure,
std::unique_ptr<SignedExchangeDevToolsProxy> devtools_proxy,
std::unique_ptr<SignedExchangeReporter> reporter,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
URLLoaderThrottlesGetter url_loader_throttles_getter,
int frame_tree_node_id,
const std::string& accept_langs,
bool keep_entry_for_prefetch_cache)
: … { … }
SignedExchangeLoader::~SignedExchangeLoader() = default;
void SignedExchangeLoader::OnReceiveEarlyHints(
network::mojom::EarlyHintsPtr early_hints) { … }
void SignedExchangeLoader::OnReceiveResponse(
network::mojom::URLResponseHeadPtr response_head,
mojo::ScopedDataPipeConsumerHandle body,
std::optional<mojo_base::BigBuffer> cached_metadata) { … }
void SignedExchangeLoader::OnReceiveRedirect(
const net::RedirectInfo& redirect_info,
network::mojom::URLResponseHeadPtr response_head) { … }
void SignedExchangeLoader::OnUploadProgress(
int64_t current_position,
int64_t total_size,
OnUploadProgressCallback ack_callback) { … }
void SignedExchangeLoader::OnTransferSizeUpdated(int32_t transfer_size_diff) { … }
void SignedExchangeLoader::OnComplete(
const network::URLLoaderCompletionStatus& status) { … }
void SignedExchangeLoader::FollowRedirect(
const std::vector<std::string>& removed_headers,
const net::HttpRequestHeaders& modified_headers,
const net::HttpRequestHeaders& modified_cors_exempt_headers,
const std::optional<GURL>& new_url) { … }
void SignedExchangeLoader::SetPriority(net::RequestPriority priority,
int intra_priority_value) { … }
void SignedExchangeLoader::PauseReadingBodyFromNet() { … }
void SignedExchangeLoader::ResumeReadingBodyFromNet() { … }
void SignedExchangeLoader::ConnectToClient(
mojo::PendingRemote<network::mojom::URLLoaderClient> client) { … }
std::unique_ptr<PrefetchedSignedExchangeCacheEntry>
SignedExchangeLoader::TakePrefetchedSignedExchangeCacheEntry() { … }
void SignedExchangeLoader::OnHTTPExchangeFound(
SignedExchangeLoadResult result,
net::Error error,
const GURL& request_url,
network::mojom::URLResponseHeadPtr resource_response,
std::unique_ptr<net::SourceStream> payload_stream) { … }
void SignedExchangeLoader::FinishReadingBody(int result) { … }
void SignedExchangeLoader::NotifyClientOnCompleteIfReady() { … }
void SignedExchangeLoader::ReportLoadResult(SignedExchangeLoadResult result) { … }
void SignedExchangeLoader::SetSignedExchangeHandlerFactoryForTest(
SignedExchangeHandlerFactory* factory) { … }
}