Skip to content

Commit

Permalink
Add URLLoaderFactory for loading resources from a WebBundle
Browse files Browse the repository at this point in the history
In follow-up CLs, this factory will be created by LinkWebBundle, and
will be used to load subresources from Web Bundles.

Bug: 1082020
Change-Id: I231e8c85f740e3588c2ba4c518378cd26a36a79d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2275986
Reviewed-by: Hayato Ito <hayato@chromium.org>
Reviewed-by: Tsuyoshi Horo <horo@chromium.org>
Reviewed-by: Kinuko Yasuda <kinuko@chromium.org>
Commit-Queue: Kunihiko Sakamoto <ksakamoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#786147}
  • Loading branch information
irori authored and Commit Bot committed Jul 8, 2020
1 parent 0a21544 commit def0fa3
Show file tree
Hide file tree
Showing 10 changed files with 775 additions and 32 deletions.
3 changes: 3 additions & 0 deletions components/web_package/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@ static_library("web_package") {
"web_bundle_parser.h",
"web_bundle_parser_factory.cc",
"web_bundle_parser_factory.h",
"web_bundle_utils.cc",
"web_bundle_utils.h",
]

deps = [
"//base",
"//components/cbor",
"//mojo/public/cpp/bindings",
"//net",
"//services/network/public/mojom",
]

public_deps = [ "//components/web_package/mojom" ]
Expand Down
1 change: 1 addition & 0 deletions components/web_package/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ include_rules = [
"+components/cbor",
"+mojo/public/cpp",
"+net",
"+services/network/public/mojom"
]

specific_include_rules = {
Expand Down
48 changes: 48 additions & 0 deletions components/web_package/web_bundle_utils.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/web_package/web_bundle_utils.h"

#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "components/web_package/mojom/web_bundle_parser.mojom.h"
#include "net/http/http_status_code.h"
#include "net/http/http_util.h"
#include "services/network/public/mojom/url_response_head.mojom.h"

namespace web_package {

namespace {

constexpr char kCrLf[] = "\r\n";

} // namespace

network::mojom::URLResponseHeadPtr CreateResourceResponse(
const web_package::mojom::BundleResponsePtr& response) {
std::vector<std::string> header_strings;
header_strings.push_back("HTTP/1.1 ");
header_strings.push_back(base::NumberToString(response->response_code));
header_strings.push_back(" ");
header_strings.push_back(net::GetHttpReasonPhrase(
static_cast<net::HttpStatusCode>(response->response_code)));
header_strings.push_back(kCrLf);
for (const auto& it : response->response_headers) {
header_strings.push_back(it.first);
header_strings.push_back(": ");
header_strings.push_back(it.second);
header_strings.push_back(kCrLf);
}
header_strings.push_back(kCrLf);

auto response_head = network::mojom::URLResponseHead::New();

response_head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
net::HttpUtil::AssembleRawHeaders(base::JoinString(header_strings, "")));
response_head->headers->GetMimeTypeAndCharset(&response_head->mime_type,
&response_head->charset);
return response_head;
}

} // namespace web_package
18 changes: 18 additions & 0 deletions components/web_package/web_bundle_utils.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_WEB_PACKAGE_WEB_BUNDLE_UTILS_H_
#define COMPONENTS_WEB_PACKAGE_WEB_BUNDLE_UTILS_H_

#include "components/web_package/mojom/web_bundle_parser.mojom-forward.h"
#include "services/network/public/mojom/url_response_head.mojom-forward.h"

namespace web_package {

network::mojom::URLResponseHeadPtr CreateResourceResponse(
const web_package::mojom::BundleResponsePtr& response);

} // namespace web_package

#endif // COMPONENTS_WEB_PACKAGE_WEB_BUNDLE_UTILS_H_
34 changes: 2 additions & 32 deletions content/browser/web_package/web_bundle_url_loader_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
#include <string>
#include <vector>

#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/task/post_task.h"
#include "components/web_package/web_bundle_utils.h"
#include "content/browser/web_package/web_bundle_reader.h"
#include "content/browser/web_package/web_bundle_source.h"
#include "content/public/browser/content_browser_client.h"
Expand All @@ -30,36 +30,6 @@ namespace content {

namespace {

constexpr char kCrLf[] = "\r\n";

network::mojom::URLResponseHeadPtr CreateResourceResponse(
const web_package::mojom::BundleResponsePtr& response) {
DCHECK_EQ(net::HTTP_OK, response->response_code);

std::vector<std::string> header_strings;
header_strings.push_back("HTTP/1.1 ");
header_strings.push_back(base::NumberToString(response->response_code));
header_strings.push_back(" ");
header_strings.push_back(net::GetHttpReasonPhrase(
static_cast<net::HttpStatusCode>(response->response_code)));
header_strings.push_back(kCrLf);
for (const auto& it : response->response_headers) {
header_strings.push_back(it.first);
header_strings.push_back(": ");
header_strings.push_back(it.second);
header_strings.push_back(kCrLf);
}
header_strings.push_back(kCrLf);

auto response_head = network::mojom::URLResponseHead::New();

response_head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
net::HttpUtil::AssembleRawHeaders(base::JoinString(header_strings, "")));
response_head->headers->GetMimeTypeAndCharset(&response_head->mime_type,
&response_head->charset);
return response_head;
}

void AddResponseParseErrorMessageToConsole(
int frame_tree_node_id,
const web_package::mojom::BundleResponseParseErrorPtr& error) {
Expand Down Expand Up @@ -136,7 +106,7 @@ class WebBundleURLLoaderFactory::EntryLoader final
return;
}

auto response_head = CreateResourceResponse(response);
auto response_head = web_package::CreateResourceResponse(response);
if (byte_range_) {
if (byte_range_->ComputeBounds(response->payload_length)) {
response_head->headers->UpdateWithNewRange(
Expand Down
6 changes: 6 additions & 0 deletions third_party/blink/renderer/platform/loader/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ blink_platform_sources("loader") {
"fetch/unique_identifier.h",
"fetch/url_loader/request_conversion.cc",
"fetch/url_loader/request_conversion.h",
"fetch/url_loader/web_bundle_subresource_loader.cc",
"fetch/url_loader/web_bundle_subresource_loader.h",
"fetch/url_loader/worker_main_script_loader.cc",
"fetch/url_loader/worker_main_script_loader.h",
"fetch/url_loader/worker_main_script_loader_client.h",
Expand All @@ -133,6 +135,7 @@ blink_platform_sources("loader") {
deps = [
":make_platform_loader_generated_fetch_initiator_type_names",
"//components/link_header_util",
"//components/web_package",
"//services/network/public/cpp",
"//services/network/public/mojom:mojom_blink",
]
Expand Down Expand Up @@ -166,6 +169,7 @@ jumbo_source_set("unit_tests") {
"fetch/response_body_loader_test.cc",
"fetch/shared_buffer_bytes_consumer_test.cc",
"fetch/source_keyed_cached_metadata_handler_test.cc",
"fetch/url_loader/web_bundle_subresource_loader_test.cc",
"fetch/url_loader/worker_main_script_loader_unittest.cc",
"ftp_directory_listing_test.cc",
"link_header_test.cc",
Expand All @@ -176,6 +180,8 @@ jumbo_source_set("unit_tests") {
configs += [ "//third_party/blink/renderer/platform:blink_platform_config" ]

deps = [
"//components/web_package:test_support",
"//services/network:test_support",
"//testing/gmock",
"//testing/gtest",
"//third_party/blink/renderer/platform:platform",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,12 @@ specific_include_rules = {
"request_conversion.cc" : [
"+media/media_buildflags.h"
],
"web_bundle_subresource_loader.cc" : [
"+components/web_package",
],
"web_bundle_subresource_loader_test.cc" : [
"+components/web_package",
"+net/traffic_annotation/network_traffic_annotation_test_helper.h",
"+services/network/test/test_url_loader_client.h",
],
}
Loading

0 comments on commit def0fa3

Please sign in to comment.