mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
* chore: bump chromium in DEPS to 96.0.4664.35 * chore: update patches Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com>
159 lines
8.3 KiB
Diff
159 lines
8.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: deepak1556 <hop2deep@gmail.com>
|
|
Date: Tue, 17 Aug 2021 22:42:42 -0700
|
|
Subject: feat: expose raw response headers from URLLoader
|
|
|
|
With https://chromium-review.googlesource.com/c/chromium/src/+/2856099
|
|
unfiltered response headers are only available via trusted channel
|
|
through //services/network/public/mojom/devtools_observer.mojom.
|
|
https://github.com/electron/electron/pull/30503/commits/28f4da1582d046e96cb58f3cbb590503e89dfd0d
|
|
was an attempt to use this interface but given the original response is
|
|
signalled on a different interface via URLLoaderClient::OnReceiveResponse
|
|
it is harder to sync these data from two different channels for a synchronous
|
|
event emitted on the SimpleURLLoaderWrapper::OnResponseStarted.
|
|
|
|
This patch does the minimal approach to add back the raw response
|
|
headers, moving forward we should find a way in upstream to provide
|
|
access to these headers for loader clients created on the browser process.
|
|
|
|
diff --git a/services/network/public/cpp/resource_request.cc b/services/network/public/cpp/resource_request.cc
|
|
index a24972bd0d082e47036082983d93e862b6c28ab0..74ed551279314b728e129b6c344ee1b5de58701a 100644
|
|
--- a/services/network/public/cpp/resource_request.cc
|
|
+++ b/services/network/public/cpp/resource_request.cc
|
|
@@ -231,6 +231,7 @@ bool ResourceRequest::EqualsForTesting(const ResourceRequest& request) const {
|
|
do_not_prompt_for_login == request.do_not_prompt_for_login &&
|
|
is_main_frame == request.is_main_frame &&
|
|
transition_type == request.transition_type &&
|
|
+ report_raw_headers == request.report_raw_headers &&
|
|
previews_state == request.previews_state &&
|
|
upgrade_if_insecure == request.upgrade_if_insecure &&
|
|
is_revalidating == request.is_revalidating &&
|
|
diff --git a/services/network/public/cpp/resource_request.h b/services/network/public/cpp/resource_request.h
|
|
index 2857fb52a542eab7fa52938cbc6a292328cc2003..3a21c9f473f5c042a880d633f4b83a8f1c92fd1f 100644
|
|
--- a/services/network/public/cpp/resource_request.h
|
|
+++ b/services/network/public/cpp/resource_request.h
|
|
@@ -161,6 +161,7 @@ struct COMPONENT_EXPORT(NETWORK_CPP_BASE) ResourceRequest {
|
|
bool do_not_prompt_for_login = false;
|
|
bool is_main_frame = false;
|
|
int transition_type = 0;
|
|
+ bool report_raw_headers = false;
|
|
int previews_state = 0;
|
|
bool upgrade_if_insecure = false;
|
|
bool is_revalidating = false;
|
|
diff --git a/services/network/public/cpp/url_request_mojom_traits.cc b/services/network/public/cpp/url_request_mojom_traits.cc
|
|
index 6bd39133e2d5b2bbad9ccbbded1e41eddce2a424..05d40087e89ec1edabb6017931f0d9e54a467b78 100644
|
|
--- a/services/network/public/cpp/url_request_mojom_traits.cc
|
|
+++ b/services/network/public/cpp/url_request_mojom_traits.cc
|
|
@@ -198,6 +198,7 @@ bool StructTraits<
|
|
out->do_not_prompt_for_login = data.do_not_prompt_for_login();
|
|
out->is_main_frame = data.is_main_frame();
|
|
out->transition_type = data.transition_type();
|
|
+ out->report_raw_headers = data.report_raw_headers();
|
|
out->previews_state = data.previews_state();
|
|
out->upgrade_if_insecure = data.upgrade_if_insecure();
|
|
out->is_revalidating = data.is_revalidating();
|
|
diff --git a/services/network/public/cpp/url_request_mojom_traits.h b/services/network/public/cpp/url_request_mojom_traits.h
|
|
index 86e6558f3ebfb5d0f3dee3cee70fc45f0f33123f..54efb232bf7316ce3aabbb787676acb093910047 100644
|
|
--- a/services/network/public/cpp/url_request_mojom_traits.h
|
|
+++ b/services/network/public/cpp/url_request_mojom_traits.h
|
|
@@ -267,6 +267,9 @@ struct COMPONENT_EXPORT(NETWORK_CPP_BASE)
|
|
static int32_t transition_type(const network::ResourceRequest& request) {
|
|
return request.transition_type;
|
|
}
|
|
+ static bool report_raw_headers(const network::ResourceRequest& request) {
|
|
+ return request.report_raw_headers;
|
|
+ }
|
|
static int32_t previews_state(const network::ResourceRequest& request) {
|
|
return request.previews_state;
|
|
}
|
|
diff --git a/services/network/public/mojom/url_request.mojom b/services/network/public/mojom/url_request.mojom
|
|
index 6ad61365a1dac6c18609ed63e7ab992c8949e70c..039f27017521b94eb2768f949b7217a9102aa61c 100644
|
|
--- a/services/network/public/mojom/url_request.mojom
|
|
+++ b/services/network/public/mojom/url_request.mojom
|
|
@@ -313,6 +313,9 @@ struct URLRequest {
|
|
// about this.
|
|
int32 transition_type;
|
|
|
|
+ // Whether to provide unfiltered response headers.
|
|
+ bool report_raw_headers;
|
|
+
|
|
// Whether or not to request a Preview version of the resource or let the
|
|
// browser decide.
|
|
// Note: this is an enum of type PreviewsState.
|
|
diff --git a/services/network/public/mojom/url_response_head.mojom b/services/network/public/mojom/url_response_head.mojom
|
|
index cea1fb864ab46b4b0eabf1db11a0392d6cd575c1..df033f65d50b088778268827e506963afebe0a23 100644
|
|
--- a/services/network/public/mojom/url_response_head.mojom
|
|
+++ b/services/network/public/mojom/url_response_head.mojom
|
|
@@ -7,6 +7,7 @@ module network.mojom;
|
|
import "mojo/public/mojom/base/time.mojom";
|
|
import "mojo/public/mojom/base/unguessable_token.mojom";
|
|
import "services/network/public/mojom/fetch_api.mojom";
|
|
+import "services/network/public/mojom/http_raw_headers.mojom";
|
|
import "services/network/public/mojom/ip_endpoint.mojom";
|
|
import "services/network/public/mojom/load_timing_info.mojom";
|
|
import "services/network/public/mojom/network_param.mojom";
|
|
@@ -28,6 +29,9 @@ struct URLResponseHead {
|
|
// The response headers or NULL if the URL type does not support headers.
|
|
HttpResponseHeaders headers;
|
|
|
|
+ // Actual response headers, as obtained from the network stack.
|
|
+ array<HttpRawHeaderPair> raw_response_headers;
|
|
+
|
|
// The mime type of the response. This may be a derived value.
|
|
string mime_type;
|
|
|
|
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
|
|
index 136427ff144f7ce23674f2b18e7deac5f5a5c8dd..94212b48f0a31de898f351c824b289c8c8e4dfad 100644
|
|
--- a/services/network/url_loader.cc
|
|
+++ b/services/network/url_loader.cc
|
|
@@ -526,6 +526,7 @@ URLLoader::URLLoader(
|
|
peer_closed_handle_watcher_(FROM_HERE,
|
|
mojo::SimpleWatcher::ArmingPolicy::MANUAL,
|
|
base::SequencedTaskRunnerHandle::Get()),
|
|
+ report_raw_headers_(request.report_raw_headers),
|
|
devtools_request_id_(request.devtools_request_id),
|
|
request_mode_(request.mode),
|
|
request_credentials_mode_(request.credentials_mode),
|
|
@@ -669,7 +670,7 @@ URLLoader::URLLoader(
|
|
url_request_->SetRequestHeadersCallback(base::BindRepeating(
|
|
&URLLoader::SetRawRequestHeadersAndNotify, base::Unretained(this)));
|
|
|
|
- if (devtools_request_id()) {
|
|
+ if (devtools_request_id() || report_raw_headers_) {
|
|
url_request_->SetResponseHeadersCallback(base::BindRepeating(
|
|
&URLLoader::SetRawResponseHeaders, base::Unretained(this)));
|
|
}
|
|
@@ -1299,6 +1300,19 @@ void URLLoader::OnResponseStarted(net::URLRequest* url_request, int net_error) {
|
|
response_ = network::mojom::URLResponseHead::New();
|
|
PopulateResourceResponse(url_request_.get(), is_load_timing_enabled_,
|
|
options_, response_.get());
|
|
+ if (raw_response_headers_ && report_raw_headers_) {
|
|
+ std::vector<network::mojom::HttpRawHeaderPairPtr> header_array;
|
|
+ size_t iterator = 0;
|
|
+ std::string name, value;
|
|
+ while (raw_response_headers_->EnumerateHeaderLines(&iterator, &name, &value)) {
|
|
+ network::mojom::HttpRawHeaderPairPtr pair =
|
|
+ network::mojom::HttpRawHeaderPair::New();
|
|
+ pair->key = name;
|
|
+ pair->value = value;
|
|
+ header_array.push_back(std::move(pair));
|
|
+ }
|
|
+ response_->raw_response_headers = std::move(header_array);
|
|
+ }
|
|
|
|
// Parse and remove the Trust Tokens response headers, if any are expected,
|
|
// potentially failing the request if an error occurs.
|
|
diff --git a/services/network/url_loader.h b/services/network/url_loader.h
|
|
index f40ab2d8823e0b7f71b9ea7932d258022518e632..a36ab764380d542b060979763d20dbf65e1925b5 100644
|
|
--- a/services/network/url_loader.h
|
|
+++ b/services/network/url_loader.h
|
|
@@ -497,6 +497,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) URLLoader
|
|
std::unique_ptr<ResourceScheduler::ScheduledResourceRequest>
|
|
resource_scheduler_request_handle_;
|
|
|
|
+ // Whether client requested raw headers.
|
|
+ bool report_raw_headers_ = false;
|
|
bool enable_reporting_raw_headers_ = false;
|
|
net::HttpRawRequestHeaders raw_request_headers_;
|
|
scoped_refptr<const net::HttpResponseHeaders> raw_response_headers_;
|