Commit 753da3d9 authored by Ben Kelly's avatar Ben Kelly Committed by Commit Bot

Fetch: Unify response initialization code.

Currently FetchResponseData is initialized from a ResourceResponse in
two places; fetch_manager.cc and fetch_event.cc.  The code in these
two different locations is often out of sync.  This results in the
service worker navigation preload Response not working like other
Response objects.

This CL refactors the initialization into a common routine that is
called from both sites.  This is in preparation to add more attributes
that need to be set during initialization in a later CL.

Bug: 1069813
Change-Id: I67b244bce8066a7e7d291c78fbf48ca863c19598
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2147193
Commit-Queue: Ben Kelly <wanderview@chromium.org>
Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Reviewed-by: default avatarYutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#760580}
parent c6246ceb
......@@ -410,47 +410,9 @@ void FetchManager::Loader::DidReceiveResponse(
place_holder_body_ = MakeGarbageCollected<PlaceHolderBytesConsumer>();
FetchResponseData* response_data = FetchResponseData::CreateWithBuffer(
BodyStreamBuffer::Create(script_state, place_holder_body_, signal_));
response_data->SetStatus(response.HttpStatusCode());
if (response.CurrentRequestUrl().ProtocolIsAbout() ||
response.CurrentRequestUrl().ProtocolIsData() ||
response.CurrentRequestUrl().ProtocolIs("blob")) {
response_data->SetStatusMessage("OK");
} else {
response_data->SetStatusMessage(response.HttpStatusText());
}
for (auto& it : response.HttpHeaderFields())
response_data->HeaderList()->Append(it.key, it.value);
// Corresponds to https://fetch.spec.whatwg.org/#main-fetch step:
// "If |internalResponse|’s URL list is empty, then set it to a clone of
// |request|’s URL list."
if (response.UrlListViaServiceWorker().IsEmpty()) {
// Note: |UrlListViaServiceWorker()| is empty, unless the response came from
// a service worker, in which case it will only be empty if it was created
// through new Response().
response_data->SetURLList(url_list_);
} else {
DCHECK(response.WasFetchedViaServiceWorker());
response_data->SetURLList(response.UrlListViaServiceWorker());
}
response_data->SetMimeType(response.MimeType());
response_data->SetResponseTime(response.ResponseTime());
if (response.WasCached()) {
response_data->SetResponseSource(
network::mojom::FetchResponseSource::kHttpCache);
} else if (!response.WasFetchedViaServiceWorker()) {
response_data->SetResponseSource(
network::mojom::FetchResponseSource::kNetwork);
}
// Note if the response was loaded with credentials enabled.
response_data->SetLoadedWithCredentials(
fetch_request_data_->Credentials() == CredentialsMode::kInclude ||
(fetch_request_data_->Credentials() == CredentialsMode::kSameOrigin &&
tainting == FetchRequestData::kBasicTainting));
response_data->InitFromResourceResponse(
url_list_, fetch_request_data_->Credentials(), tainting, response);
FetchResponseData* tainted_response = nullptr;
......
......@@ -290,6 +290,53 @@ mojom::blink::FetchAPIResponsePtr FetchResponseData::PopulateFetchAPIResponse(
return response;
}
void FetchResponseData::InitFromResourceResponse(
const Vector<KURL>& request_url_list,
network::mojom::CredentialsMode request_credentials,
FetchRequestData::Tainting tainting,
const ResourceResponse& response) {
SetStatus(response.HttpStatusCode());
if (response.CurrentRequestUrl().ProtocolIsAbout() ||
response.CurrentRequestUrl().ProtocolIsData() ||
response.CurrentRequestUrl().ProtocolIs("blob")) {
SetStatusMessage("OK");
} else {
SetStatusMessage(response.HttpStatusText());
}
for (auto& it : response.HttpHeaderFields())
HeaderList()->Append(it.key, it.value);
// Corresponds to https://fetch.spec.whatwg.org/#main-fetch step:
// "If |internalResponse|’s URL list is empty, then set it to a clone of
// |request|’s URL list."
if (response.UrlListViaServiceWorker().IsEmpty()) {
// Note: |UrlListViaServiceWorker()| is empty, unless the response came from
// a service worker, in which case it will only be empty if it was created
// through new Response().
SetURLList(request_url_list);
} else {
DCHECK(response.WasFetchedViaServiceWorker());
SetURLList(response.UrlListViaServiceWorker());
}
SetMimeType(response.MimeType());
SetResponseTime(response.ResponseTime());
if (response.WasCached()) {
SetResponseSource(network::mojom::FetchResponseSource::kHttpCache);
} else if (!response.WasFetchedViaServiceWorker()) {
SetResponseSource(network::mojom::FetchResponseSource::kNetwork);
}
// TODO(wanderview): Remove |tainting| and use |response.GetType()|
// instead once the OOR-CORS disabled path is removed.
SetLoadedWithCredentials(
request_credentials == network::mojom::CredentialsMode::kInclude ||
(request_credentials == network::mojom::CredentialsMode::kSameOrigin &&
tainting == FetchRequestData::kBasicTainting));
}
FetchResponseData::FetchResponseData(Type type,
network::mojom::FetchResponseSource source,
uint16_t status,
......
......@@ -14,7 +14,9 @@
#include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom-blink-forward.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/fetch/body_stream_buffer.h"
#include "third_party/blink/renderer/core/fetch/fetch_request_data.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_response.h"
#include "third_party/blink/renderer/platform/network/http_header_set.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
......@@ -119,6 +121,13 @@ class CORE_EXPORT FetchResponseData final
mojom::blink::FetchAPIResponsePtr PopulateFetchAPIResponse(
const KURL& request_url);
// Initialize non-body data from the given |response|.
void InitFromResourceResponse(
const Vector<KURL>& request_url_list,
network::mojom::CredentialsMode request_credentials,
FetchRequestData::Tainting tainting,
const ResourceResponse& response);
void Trace(Visitor*);
private:
......
......@@ -136,16 +136,12 @@ void FetchEvent::OnNavigationPreloadResponse(
: FetchResponseData::Create();
Vector<KURL> url_list(1);
url_list[0] = preload_response_->CurrentRequestUrl();
response_data->SetURLList(url_list);
response_data->SetStatus(preload_response_->HttpStatusCode());
response_data->SetStatusMessage(preload_response_->HttpStatusText());
response_data->SetResponseTime(
preload_response_->ToResourceResponse().ResponseTime());
const HTTPHeaderMap& headers(
preload_response_->ToResourceResponse().HttpHeaderFields());
for (const auto& header : headers) {
response_data->HeaderList()->Append(header.key, header.value);
}
response_data->InitFromResourceResponse(
url_list, network::mojom::CredentialsMode::kInclude,
FetchRequestData::kBasicTainting,
preload_response_->ToResourceResponse());
FetchResponseData* tainted_response =
network_utils::IsRedirectResponseCode(preload_response_->HttpStatusCode())
? response_data->CreateOpaqueRedirectFilteredResponse()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment