blob: d5d772f616143d1a50280666129a914f17c7c4a1 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_NETWORK_URL_LOADER_UTIL_H_
#define SERVICES_NETWORK_URL_LOADER_UTIL_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/component_export.h"
#include "base/files/file.h"
#include "base/time/time.h"
#include "net/base/isolation_info.h"
#include "net/cookies/cookie_setting_override.h"
#include "net/cookies/cookie_util.h"
#include "services/network/public/mojom/client_security_state.mojom-forward.h"
#include "services/network/public/mojom/devtools_observer.mojom.h"
#include "services/network/public/mojom/fetch_api.mojom-forward.h"
#include "services/network/public/mojom/network_context.mojom-forward.h"
#include "services/network/public/mojom/url_response_head.mojom-forward.h"
namespace base {
class SequencedTaskRunner;
} // namespace base
namespace net {
class HttpRequestHeaders;
class HttpResponseInfo;
class UploadDataStream;
class URLRequest;
} // namespace net
namespace network {
namespace cors {
class OriginAccessList;
} // namespace cors
namespace mojom {
enum class IPAddressSpace;
enum class RequestDestination;
class URLLoaderFactoryParams;
} // namespace mojom
struct ResourceRequest;
class ResourceRequestBody;
class SharedResourceChecker;
namespace url_loader_util {
// Returns true if `request` represents a fetch upload request with a streaming
// body. This is determined by checking if the request body contains exactly
// one element, which is a read-only-once chunked data pipe.
bool HasFetchStreamingUploadBody(const ResourceRequest&);
// Creates a net::UploadDataStream from the passed `body` and `opened_files`.
// `file_task_runner` will be used for reading file elements in the `body`.
std::unique_ptr<net::UploadDataStream> CreateUploadDataStream(
ResourceRequestBody* body,
std::vector<base::File>& opened_files,
base::SequencedTaskRunner* file_task_runner);
// Computes the CookieSettingOverrides to use for a given `ResourceRequest`.
// May also emit to histograms.
COMPONENT_EXPORT(NETWORK_SERVICE)
net::CookieSettingOverrides CalculateCookieSettingOverrides(
net::CookieSettingOverrides factory_overrides,
net::CookieSettingOverrides devtools_overrides,
const ResourceRequest& request,
bool emit_metrics);
// Determines the IsolationInfo for a request, checking sources in priority:
// 1. `factory_isolation_info` (if non-empty).
// 2. `request.trusted_params->isolation_info` (if non-empty).
// 3. Auto-created based on `request.url` origin if
// `automatically_assign_isolation_info` is true.
// Returns `std::nullopt` if none of the above apply.
std::optional<net::IsolationInfo> GetIsolationInfo(
const net::IsolationInfo& factory_isolation_info,
bool automatically_assign_isolation_info,
const ResourceRequest& request);
// Retrieves the Cookie header from either `cors_exempt_headers` or `headers`.
std::string GetCookiesFromHeaders(
const net::HttpRequestHeaders& headers,
const net::HttpRequestHeaders& cors_exempt_headers);
// Records UMA histograms for request sizes and categorizes them.
void RecordURLLoaderRequestMetrics(const net::URLRequest& url_request,
size_t raw_request_line_size,
size_t raw_request_headers_size);
// Records UMA metrics related to shared dictionary usage for non-cached
// responses.
void MaybeRecordSharedDictionaryUsedResponseMetrics(
int error_code,
network::mojom::RequestDestination destination,
const net::HttpResponseInfo& response_info,
bool shared_dictionary_allowed_check_passed);
// Configures the given `url_request` based on the properties specified in
// `request` and context/factory parameters (`factory_params`,
// `origin_access_list`).
void ConfigureUrlRequest(const ResourceRequest& request,
const mojom::URLLoaderFactoryParams& factory_params,
const cors::OriginAccessList& origin_access_list,
net::URLRequest& url_request,
SharedResourceChecker& shared_resource_checker);
// Sets credential-related flags (`allow_credentials`, `send_client_certs`)
// on the `url_request` based on the request's properties and security context.
// Checks both the request's `credentials_mode` and relevant web platform
// policies (COEP, DIP). May also add the `net::LOAD_BYPASS_CACHE` flag if web
// policies disallow credentials.
void SetRequestCredentials(
const GURL& url,
const network::mojom::ClientSecurityStatePtr& client_security_state,
mojom::RequestMode request_mode,
mojom::CredentialsMode credentials_mode,
const std::optional<url::Origin>& initiator,
net::URLRequest& url_request);
// Selects between the `client_security_state` fields in
// `url_loader_factory_params` and the ClientSecurityState from
// ResourceRequest::TrustedParams`, preferring the latter. If both have null
// values, returns null, which is a valid value.
//
// While it would be safer to take a ResourceRequest/TrustedParams and/or
// URLLoaderFactoryParams to prevent misordering of arguments, unfortunately,
// the callsites for this method don't consistently have those available.
const mojom::ClientSecurityState* SelectClientSecurityState(
const mojom::ClientSecurityState*
url_loader_factory_params_client_security_state,
const mojom::ClientSecurityState* trusted_params_client_security_state);
// Constructs a mojom::URLResponseHead based on the state of a
// net::URLRequest and additional context provided by the URLLoader.
mojom::URLResponseHeadPtr BuildResponseHead(
const net::URLRequest& url_request,
const net::cookie_util::ParsedRequestCookies& request_cookies,
network::mojom::IPAddressSpace client_address_space,
network::mojom::IPAddressSpace response_address_space,
int32_t url_load_options,
bool load_with_storage_access,
bool is_load_timing_enabled,
bool include_load_timing_internal_info_with_response,
base::TimeTicks response_start,
const raw_ptr<mojom::DevToolsObserver> devtools_observer,
const std::string& devtools_request_id);
} // namespace url_loader_util
} // namespace network
#endif // SERVICES_NETWORK_URL_LOADER_UTIL_H_