Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2018 The Chromium Authors |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "content/browser/loader/prefetch_url_loader.h" |
| 6 | |
Kinuko Yasuda | 8edb9246 | 2018-02-21 15:46:57 | [diff] [blame] | 7 | #include "base/feature_list.h" |
Avi Drissman | adac2199 | 2023-01-11 23:46:39 | [diff] [blame] | 8 | #include "base/functional/bind.h" |
Dominic Farolino | 2131e116 | 2019-08-09 01:15:38 | [diff] [blame] | 9 | #include "base/metrics/histogram_functions.h" |
Tsuyoshi Horo | 0e20a6e | 2019-06-04 09:48:30 | [diff] [blame] | 10 | #include "content/browser/web_package/prefetched_signed_exchange_cache.h" |
| 11 | #include "content/browser/web_package/prefetched_signed_exchange_cache_adapter.h" |
Kunihiko Sakamoto | 66b91d4 | 2018-06-15 08:29:22 | [diff] [blame] | 12 | #include "content/browser/web_package/signed_exchange_prefetch_handler.h" |
Tsuyoshi Horo | 46f5fff | 2018-05-10 12:33:35 | [diff] [blame] | 13 | #include "content/browser/web_package/signed_exchange_utils.h" |
Matt Falkenhagen | f6971ae | 2020-06-25 08:17:46 | [diff] [blame] | 14 | #include "content/public/browser/browser_context.h" |
Noam Rosenthal | 74f4a48a | 2022-12-15 17:15:38 | [diff] [blame] | 15 | #include "content/public/browser/frame_accept_header.h" |
Kinuko Yasuda | 8edb9246 | 2018-02-21 15:46:57 | [diff] [blame] | 16 | #include "content/public/common/content_features.h" |
Dominic Farolino | dee12624 | 2019-09-09 16:58:39 | [diff] [blame] | 17 | #include "net/base/load_flags.h" |
Brianna Goldstein | d22b064 | 2022-10-11 16:30:50 | [diff] [blame] | 18 | #include "net/base/network_anonymization_key.h" |
Yutaka Hirano | 2aef179 | 2020-02-17 23:38:15 | [diff] [blame] | 19 | #include "net/http/http_request_headers.h" |
Kinuko Yasuda | 8edb9246 | 2018-02-21 15:46:57 | [diff] [blame] | 20 | #include "services/network/public/cpp/features.h" |
Aman Verma | 5637b1cd | 2022-12-09 21:05:55 | [diff] [blame] | 21 | #include "services/network/public/cpp/record_ontransfersizeupdate_utils.h" |
Chong Zhang | b7c8d1ce | 2018-03-13 19:14:11 | [diff] [blame] | 22 | #include "services/network/public/cpp/shared_url_loader_factory.h" |
Hans Wennborg | 78b5218 | 2021-06-15 13:42:15 | [diff] [blame] | 23 | #include "services/network/public/mojom/early_hints.mojom.h" |
Noam Rosenthal | 74f4a48a | 2022-12-15 17:15:38 | [diff] [blame] | 24 | #include "services/network/public/mojom/fetch_api.mojom-shared.h" |
Dominic Farolino | 2131e116 | 2019-08-09 01:15:38 | [diff] [blame] | 25 | #include "third_party/blink/public/common/features.h" |
Kinuko Yasuda | eeae697 | 2018-02-20 08:38:11 | [diff] [blame] | 26 | |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 27 | namespace content { |
| 28 | |
Tsuyoshi Horo | 60be6b1 | 2018-09-29 04:28:18 | [diff] [blame] | 29 | namespace { |
| 30 | |
Noam Rosenthal | 74f4a48a | 2022-12-15 17:15:38 | [diff] [blame] | 31 | constexpr char kSignedExchangeEnabledAcceptHeaderForCrossOriginPrefetch[] = |
Kunihiko Sakamoto | 1d84ea3 | 2021-09-01 04:15:55 | [diff] [blame] | 32 | "application/signed-exchange;v=b3;q=0.7,*/*;q=0.8"; |
Tsuyoshi Horo | 60be6b1 | 2018-09-29 04:28:18 | [diff] [blame] | 33 | |
| 34 | } // namespace |
| 35 | |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 36 | PrefetchURLLoader::PrefetchURLLoader( |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 37 | int32_t request_id, |
| 38 | uint32_t options, |
Avi Drissman | 580a3da6 | 2024-09-04 16:16:56 | [diff] [blame] | 39 | FrameTreeNodeId frame_tree_node_id, |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 40 | const network::ResourceRequest& resource_request, |
Brianna Goldstein | d22b064 | 2022-10-11 16:30:50 | [diff] [blame] | 41 | const net::NetworkAnonymizationKey& network_anonymization_key, |
Julie Jeongeun Kim | 6dd4c7b | 2019-11-18 05:56:30 | [diff] [blame] | 42 | mojo::PendingRemote<network::mojom::URLLoaderClient> client, |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 43 | const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, |
Chong Zhang | b7c8d1ce | 2018-03-13 19:14:11 | [diff] [blame] | 44 | scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory, |
Kinuko Yasuda | eeae697 | 2018-02-20 08:38:11 | [diff] [blame] | 45 | URLLoaderThrottlesGetter url_loader_throttles_getter, |
Clark DuVall | ab63d14 | 2019-07-23 04:24:36 | [diff] [blame] | 46 | BrowserContext* browser_context, |
Tsuyoshi Horo | 242ee8f | 2019-04-26 06:37:07 | [diff] [blame] | 47 | scoped_refptr<PrefetchedSignedExchangeCache> |
| 48 | prefetched_signed_exchange_cache, |
Dominic Farolino | dee12624 | 2019-09-09 16:58:39 | [diff] [blame] | 49 | const std::string& accept_langs, |
| 50 | RecursivePrefetchTokenGenerator recursive_prefetch_token_generator) |
Tsuyoshi Horo | f36fc4ef | 2019-10-16 10:02:12 | [diff] [blame] | 51 | : frame_tree_node_id_(frame_tree_node_id), |
Tsuyoshi Horo | d0a953d | 2019-01-23 04:38:14 | [diff] [blame] | 52 | resource_request_(resource_request), |
Brianna Goldstein | d22b064 | 2022-10-11 16:30:50 | [diff] [blame] | 53 | network_anonymization_key_(network_anonymization_key), |
Tsuyoshi Horo | cdbb490 | 2018-04-12 06:09:14 | [diff] [blame] | 54 | network_loader_factory_(std::move(network_loader_factory)), |
Kinuko Yasuda | eeae697 | 2018-02-20 08:38:11 | [diff] [blame] | 55 | forwarding_client_(std::move(client)), |
| 56 | url_loader_throttles_getter_(url_loader_throttles_getter), |
Dominic Farolino | dee12624 | 2019-09-09 16:58:39 | [diff] [blame] | 57 | accept_langs_(accept_langs), |
| 58 | recursive_prefetch_token_generator_( |
Clark DuVall | 3b2b88c5 | 2019-10-28 18:43:09 | [diff] [blame] | 59 | std::move(recursive_prefetch_token_generator)), |
| 60 | is_signed_exchange_handling_enabled_( |
| 61 | signed_exchange_utils::IsSignedExchangeHandlingEnabled( |
| 62 | browser_context)) { |
Kinuko Yasuda | 8edb9246 | 2018-02-21 15:46:57 | [diff] [blame] | 63 | DCHECK(network_loader_factory_); |
Andrew Williams | 66c039a5 | 2024-08-01 16:27:04 | [diff] [blame] | 64 | CHECK(!resource_request.trusted_params || |
| 65 | resource_request.trusted_params->isolation_info.request_type() == |
| 66 | net::IsolationInfo::RequestType::kOther || |
| 67 | resource_request.trusted_params->isolation_info.request_type() == |
| 68 | net::IsolationInfo::RequestType::kMainFrame); |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 69 | |
Clark DuVall | 3b2b88c5 | 2019-10-28 18:43:09 | [diff] [blame] | 70 | if (is_signed_exchange_handling_enabled_) { |
Kunihiko Sakamoto | 50ed8305b | 2019-02-22 04:02:31 | [diff] [blame] | 71 | // Set the SignedExchange accept header. |
Tsuyoshi Horo | 60be6b1 | 2018-09-29 04:28:18 | [diff] [blame] | 72 | // (https://wicg.github.io/webpackage/draft-yasskin-http-origin-signed-responses.html#internet-media-type-applicationsigned-exchange). |
Noam Rosenthal | 74f4a48a | 2022-12-15 17:15:38 | [diff] [blame] | 73 | |
Alison Gale | 81f4f2c7 | 2024-04-22 19:33:31 | [diff] [blame] | 74 | // TODO(crbug.com/40250488): find a solution for CORS requests, |
Noam Rosenthal | 74f4a48a | 2022-12-15 17:15:38 | [diff] [blame] | 75 | // perhaps exempt the Accept header from the 128-byte rule |
| 76 | // (https://fetch.spec.whatwg.org/#cors-safelisted-request-header). For now, |
| 77 | // we use the frame Accept header for prefetches only in requests with a |
| 78 | // no-cors/same-origin mode to avoid an unintended preflight. |
| 79 | std::string accept_header = |
| 80 | resource_request_.mode == network::mojom::RequestMode::kCors |
| 81 | ? kSignedExchangeEnabledAcceptHeaderForCrossOriginPrefetch |
| 82 | : FrameAcceptHeaderValue(/*allow_sxg_responses=*/true, |
| 83 | browser_context); |
| 84 | resource_request_.headers.SetHeader(net::HttpRequestHeaders::kAccept, |
| 85 | std::move(accept_header)); |
Kunihiko Sakamoto | 2bebcc1 | 2022-08-19 08:00:18 | [diff] [blame] | 86 | if (prefetched_signed_exchange_cache) { |
Tsuyoshi Horo | 242ee8f | 2019-04-26 06:37:07 | [diff] [blame] | 87 | prefetched_signed_exchange_cache_adapter_ = |
| 88 | std::make_unique<PrefetchedSignedExchangeCacheAdapter>( |
Clark DuVall | a1220f7 | 2019-08-02 19:00:57 | [diff] [blame] | 89 | std::move(prefetched_signed_exchange_cache), |
Lukasz Anforowicz | 7ef1cfd | 2021-05-04 02:18:37 | [diff] [blame] | 90 | browser_context->GetBlobStorageContext(), resource_request.url, |
| 91 | this); |
Tsuyoshi Horo | 242ee8f | 2019-04-26 06:37:07 | [diff] [blame] | 92 | } |
Tsuyoshi Horo | 60be6b1 | 2018-09-29 04:28:18 | [diff] [blame] | 93 | } |
| 94 | |
Kinuko Yasuda | 8edb9246 | 2018-02-21 15:46:57 | [diff] [blame] | 95 | network_loader_factory_->CreateLoaderAndStart( |
Dave Tapuska | 28226d04 | 2021-03-17 14:21:29 | [diff] [blame] | 96 | loader_.BindNewPipeAndPassReceiver(), request_id, options, |
Julie Jeongeun Kim | 6dd4c7b | 2019-11-18 05:56:30 | [diff] [blame] | 97 | resource_request_, client_receiver_.BindNewPipeAndPassRemote(), |
| 98 | traffic_annotation); |
| 99 | client_receiver_.set_disconnect_handler(base::BindOnce( |
| 100 | &PrefetchURLLoader::OnNetworkConnectionError, base::Unretained(this))); |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | PrefetchURLLoader::~PrefetchURLLoader() = default; |
| 104 | |
Chong Zhang | f19dde9 | 2018-05-23 04:33:59 | [diff] [blame] | 105 | void PrefetchURLLoader::FollowRedirect( |
Arthur Sonzogni | 62a4f435 | 2019-01-07 16:37:25 | [diff] [blame] | 106 | const std::vector<std::string>& removed_headers, |
| 107 | const net::HttpRequestHeaders& modified_headers, |
Takashi Toyoshima | eb2ba20c5 | 2020-04-27 16:34:58 | [diff] [blame] | 108 | const net::HttpRequestHeaders& modified_cors_exempt_headers, |
Arthur Sonzogni | c686e8f | 2024-01-11 08:36:37 | [diff] [blame] | 109 | const std::optional<GURL>& new_url) { |
Jun Cai | 23627f04 | 2019-01-17 05:09:10 | [diff] [blame] | 110 | DCHECK(modified_headers.IsEmpty()) |
Arthur Sonzogni | 62a4f435 | 2019-01-07 16:37:25 | [diff] [blame] | 111 | << "Redirect with modified headers was not supported yet. " |
| 112 | "crbug.com/845683"; |
| 113 | DCHECK(!new_url) << "Redirect with modified URL was not " |
| 114 | "supported yet. crbug.com/845683"; |
Kunihiko Sakamoto | 66b91d4 | 2018-06-15 08:29:22 | [diff] [blame] | 115 | if (signed_exchange_prefetch_handler_) { |
Julie Jeongeun Kim | 028b2c9 | 2019-11-08 02:51:16 | [diff] [blame] | 116 | // Rebind |client_receiver_| and |loader_|. |
| 117 | client_receiver_.Bind(signed_exchange_prefetch_handler_->FollowRedirect( |
Julie Jeongeun Kim | 917c19790 | 2019-11-26 03:36:14 | [diff] [blame] | 118 | loader_.BindNewPipeAndPassReceiver())); |
Kinuko Yasuda | 8edb9246 | 2018-02-21 15:46:57 | [diff] [blame] | 119 | return; |
| 120 | } |
| 121 | |
Kinuko Yasuda | 39fcea9 | 2019-02-04 09:52:28 | [diff] [blame] | 122 | DCHECK(loader_); |
Takashi Toyoshima | eb2ba20c5 | 2020-04-27 16:34:58 | [diff] [blame] | 123 | loader_->FollowRedirect( |
| 124 | removed_headers, net::HttpRequestHeaders() /* modified_headers */, |
| 125 | net::HttpRequestHeaders() /* modified_cors_exempt_headers */, |
Arthur Sonzogni | c686e8f | 2024-01-11 08:36:37 | [diff] [blame] | 126 | std::nullopt); |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 127 | } |
| 128 | |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 129 | void PrefetchURLLoader::SetPriority(net::RequestPriority priority, |
| 130 | int intra_priority_value) { |
Solomon Kinard | ab293bae | 2024-09-19 17:13:51 | [diff] [blame] | 131 | if (loader_) { |
Kinuko Yasuda | 39fcea9 | 2019-02-04 09:52:28 | [diff] [blame] | 132 | loader_->SetPriority(priority, intra_priority_value); |
Solomon Kinard | ab293bae | 2024-09-19 17:13:51 | [diff] [blame] | 133 | } |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 134 | } |
| 135 | |
Kenichi Ishibashi | 8a16c14 | 2021-03-13 02:55:33 | [diff] [blame] | 136 | void PrefetchURLLoader::OnReceiveEarlyHints( |
| 137 | network::mojom::EarlyHintsPtr early_hints) { |
| 138 | forwarding_client_->OnReceiveEarlyHints(std::move(early_hints)); |
| 139 | } |
| 140 | |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 141 | void PrefetchURLLoader::OnReceiveResponse( |
John Abd-El-Malek | 2e0de595 | 2022-01-25 00:12:35 | [diff] [blame] | 142 | network::mojom::URLResponseHeadPtr response, |
Leszek Swirski | 154cddb | 2022-08-29 17:57:19 | [diff] [blame] | 143 | mojo::ScopedDataPipeConsumerHandle body, |
Arthur Sonzogni | c686e8f | 2024-01-11 08:36:37 | [diff] [blame] | 144 | std::optional<mojo_base::BigBuffer> cached_metadata) { |
Clark DuVall | 3b2b88c5 | 2019-10-28 18:43:09 | [diff] [blame] | 145 | if (is_signed_exchange_handling_enabled_ && |
Kunihiko Sakamoto | f586da6 | 2019-03-28 03:03:04 | [diff] [blame] | 146 | signed_exchange_utils::ShouldHandleAsSignedHTTPExchange( |
Lucas Furukawa Gadani | d661c0d | 2019-12-02 19:58:16 | [diff] [blame] | 147 | resource_request_.url, *response)) { |
Kunihiko Sakamoto | 66b91d4 | 2018-06-15 08:29:22 | [diff] [blame] | 148 | DCHECK(!signed_exchange_prefetch_handler_); |
Tsuyoshi Horo | ec6325b8 | 2020-07-16 03:21:44 | [diff] [blame] | 149 | const bool keep_entry_for_prefetch_cache = |
| 150 | !!prefetched_signed_exchange_cache_adapter_; |
Matt Menke | 5aaa70b | 2020-10-30 14:03:03 | [diff] [blame] | 151 | |
Kinuko Yasuda | 8edb9246 | 2018-02-21 15:46:57 | [diff] [blame] | 152 | // Note that after this point this doesn't directly get upcalls from the |
| 153 | // network. (Until |this| calls the handler's FollowRedirect.) |
Kunihiko Sakamoto | 66b91d4 | 2018-06-15 08:29:22 | [diff] [blame] | 154 | signed_exchange_prefetch_handler_ = |
| 155 | std::make_unique<SignedExchangePrefetchHandler>( |
Lucas Furukawa Gadani | d661c0d | 2019-12-02 19:58:16 | [diff] [blame] | 156 | frame_tree_node_id_, resource_request_, std::move(response), |
John Abd-El-Malek | 2e0de595 | 2022-01-25 00:12:35 | [diff] [blame] | 157 | std::move(body), loader_.Unbind(), client_receiver_.Unbind(), |
| 158 | network_loader_factory_, url_loader_throttles_getter_, this, |
Kunihiko Sakamoto | c14fa81 | 2023-02-17 04:21:21 | [diff] [blame] | 159 | network_anonymization_key_, accept_langs_, |
Brianna Goldstein | d22b064 | 2022-10-11 16:30:50 | [diff] [blame] | 160 | keep_entry_for_prefetch_cache); |
Kinuko Yasuda | 8edb9246 | 2018-02-21 15:46:57 | [diff] [blame] | 161 | return; |
| 162 | } |
Dominic Farolino | dee12624 | 2019-09-09 16:58:39 | [diff] [blame] | 163 | |
| 164 | // If the response is marked as a restricted cross-origin prefetch, we |
| 165 | // populate the response's |recursive_prefetch_token| member with a unique |
| 166 | // token. The renderer will propagate this token to recursive prefetches |
| 167 | // coming from this response, in the form of preload headers. This token is |
| 168 | // later used by the PrefetchURLLoaderService to recover the correct |
Brianna Goldstein | d22b064 | 2022-10-11 16:30:50 | [diff] [blame] | 169 | // NetworkAnonymizationKey to use when fetching the request. In the Signed |
Dominic Farolino | dee12624 | 2019-09-09 16:58:39 | [diff] [blame] | 170 | // Exchange case, we do this after redirects from the outer response, because |
| 171 | // we redirect back here for the inner response. |
Andrew Williams | 48e2119 | 2024-08-01 19:48:32 | [diff] [blame] | 172 | if (resource_request_.load_flags & |
| 173 | net::LOAD_RESTRICTED_PREFETCH_FOR_MAIN_FRAME) { |
Dominic Farolino | dee12624 | 2019-09-09 16:58:39 | [diff] [blame] | 174 | DCHECK(!recursive_prefetch_token_generator_.is_null()); |
| 175 | base::UnguessableToken recursive_prefetch_token = |
| 176 | std::move(recursive_prefetch_token_generator_).Run(resource_request_); |
| 177 | response->recursive_prefetch_token = recursive_prefetch_token; |
| 178 | } |
| 179 | |
Leszek Swirski | 154cddb | 2022-08-29 17:57:19 | [diff] [blame] | 180 | // Just drop any cached metadata; we don't need to forward it to the renderer |
| 181 | // for prefetch. |
| 182 | cached_metadata.reset(); |
| 183 | |
John Abd-El-Malek | 998d826 | 2022-05-10 06:33:39 | [diff] [blame] | 184 | if (!body) { |
| 185 | forwarding_client_->OnReceiveResponse(std::move(response), |
Leszek Swirski | 154cddb | 2022-08-29 17:57:19 | [diff] [blame] | 186 | mojo::ScopedDataPipeConsumerHandle(), |
Arthur Sonzogni | c686e8f | 2024-01-11 08:36:37 | [diff] [blame] | 187 | std::nullopt); |
John Abd-El-Malek | 998d826 | 2022-05-10 06:33:39 | [diff] [blame] | 188 | return; |
| 189 | } |
| 190 | |
| 191 | response_ = std::move(response); |
| 192 | if (prefetched_signed_exchange_cache_adapter_ && |
| 193 | signed_exchange_prefetch_handler_) { |
| 194 | prefetched_signed_exchange_cache_adapter_->OnStartLoadingResponseBody( |
| 195 | std::move(body)); |
| 196 | return; |
| 197 | } |
| 198 | |
| 199 | // Just drain the original response's body here. |
| 200 | DCHECK(!pipe_drainer_); |
| 201 | pipe_drainer_ = |
| 202 | std::make_unique<mojo::DataPipeDrainer>(this, std::move(body)); |
| 203 | |
| 204 | SendEmptyBody(); |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 205 | } |
| 206 | |
| 207 | void PrefetchURLLoader::OnReceiveRedirect( |
| 208 | const net::RedirectInfo& redirect_info, |
Lucas Furukawa Gadani | 81e294b | 2019-08-29 16:26:32 | [diff] [blame] | 209 | network::mojom::URLResponseHeadPtr head) { |
Tsuyoshi Horo | 242ee8f | 2019-04-26 06:37:07 | [diff] [blame] | 210 | if (prefetched_signed_exchange_cache_adapter_ && |
| 211 | signed_exchange_prefetch_handler_) { |
Tsuyoshi Horo | ec6325b8 | 2020-07-16 03:21:44 | [diff] [blame] | 212 | prefetched_signed_exchange_cache_adapter_->OnReceiveSignedExchange( |
| 213 | signed_exchange_prefetch_handler_ |
| 214 | ->TakePrefetchedSignedExchangeCacheEntry()); |
Tsuyoshi Horo | 242ee8f | 2019-04-26 06:37:07 | [diff] [blame] | 215 | } |
| 216 | |
Tsuyoshi Horo | d0a953d | 2019-01-23 04:38:14 | [diff] [blame] | 217 | resource_request_.url = redirect_info.new_url; |
| 218 | resource_request_.site_for_cookies = redirect_info.new_site_for_cookies; |
Tsuyoshi Horo | d0a953d | 2019-01-23 04:38:14 | [diff] [blame] | 219 | resource_request_.referrer = GURL(redirect_info.new_referrer); |
| 220 | resource_request_.referrer_policy = redirect_info.new_referrer_policy; |
Lucas Furukawa Gadani | 81e294b | 2019-08-29 16:26:32 | [diff] [blame] | 221 | forwarding_client_->OnReceiveRedirect(redirect_info, std::move(head)); |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 222 | } |
| 223 | |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 224 | void PrefetchURLLoader::OnUploadProgress(int64_t current_position, |
| 225 | int64_t total_size, |
| 226 | base::OnceCallback<void()> callback) { |
| 227 | forwarding_client_->OnUploadProgress(current_position, total_size, |
| 228 | std::move(callback)); |
| 229 | } |
| 230 | |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 231 | void PrefetchURLLoader::OnTransferSizeUpdated(int32_t transfer_size_diff) { |
Aman Verma | 5637b1cd | 2022-12-09 21:05:55 | [diff] [blame] | 232 | network::RecordOnTransferSizeUpdatedUMA( |
| 233 | network::OnTransferSizeUpdatedFrom::kPrefetchURLLoader); |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 234 | forwarding_client_->OnTransferSizeUpdated(transfer_size_diff); |
| 235 | } |
| 236 | |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 237 | void PrefetchURLLoader::OnComplete( |
| 238 | const network::URLLoaderCompletionStatus& status) { |
Tsuyoshi Horo | 242ee8f | 2019-04-26 06:37:07 | [diff] [blame] | 239 | if (prefetched_signed_exchange_cache_adapter_ && |
| 240 | signed_exchange_prefetch_handler_) { |
| 241 | prefetched_signed_exchange_cache_adapter_->OnComplete(status); |
| 242 | return; |
| 243 | } |
| 244 | |
| 245 | SendOnComplete(status); |
| 246 | } |
| 247 | |
| 248 | bool PrefetchURLLoader::SendEmptyBody() { |
| 249 | // Send an empty response's body. |
| 250 | mojo::ScopedDataPipeProducerHandle producer; |
| 251 | mojo::ScopedDataPipeConsumerHandle consumer; |
Robert Sesek | 3bce5dd | 2021-02-19 19:27:58 | [diff] [blame] | 252 | if (CreateDataPipe(nullptr, producer, consumer) != MOJO_RESULT_OK) { |
Tsuyoshi Horo | 242ee8f | 2019-04-26 06:37:07 | [diff] [blame] | 253 | // No more resources available for creating a data pipe. Close the |
| 254 | // connection, which will in turn make this loader destroyed. |
| 255 | forwarding_client_->OnComplete( |
| 256 | network::URLLoaderCompletionStatus(net::ERR_INSUFFICIENT_RESOURCES)); |
| 257 | forwarding_client_.reset(); |
Julie Jeongeun Kim | 028b2c9 | 2019-11-08 02:51:16 | [diff] [blame] | 258 | client_receiver_.reset(); |
Tsuyoshi Horo | 242ee8f | 2019-04-26 06:37:07 | [diff] [blame] | 259 | return false; |
| 260 | } |
John Abd-El-Malek | 998d826 | 2022-05-10 06:33:39 | [diff] [blame] | 261 | DCHECK(response_); |
| 262 | forwarding_client_->OnReceiveResponse(std::move(response_), |
Arthur Sonzogni | c686e8f | 2024-01-11 08:36:37 | [diff] [blame] | 263 | std::move(consumer), std::nullopt); |
Tsuyoshi Horo | 242ee8f | 2019-04-26 06:37:07 | [diff] [blame] | 264 | return true; |
| 265 | } |
| 266 | |
| 267 | void PrefetchURLLoader::SendOnComplete( |
| 268 | const network::URLLoaderCompletionStatus& completion_status) { |
| 269 | forwarding_client_->OnComplete(completion_status); |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 270 | } |
| 271 | |
| 272 | void PrefetchURLLoader::OnNetworkConnectionError() { |
| 273 | // The network loader has an error; we should let the client know it's closed |
| 274 | // by dropping this, which will in turn make this loader destroyed. |
| 275 | forwarding_client_.reset(); |
| 276 | } |
| 277 | |
Kinuko Yasuda | db67b53 | 2018-02-19 09:11:52 | [diff] [blame] | 278 | } // namespace content |