blob: 3f8f9d89371155c4a450245a8a2224ac278302ba [file] [log] [blame]
// Copyright 2017 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 "content/browser/loader/web_package_request_handler.h"
#include "base/bind.h"
#include "base/feature_list.h"
#include "content/browser/loader/web_package_loader.h"
#include "content/common/throttling_url_loader.h"
#include "content/public/common/content_features.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "net/http/http_response_headers.h"
#include "services/network/public/cpp/resource_response.h"
#include "services/network/public/interfaces/url_loader.mojom.h"
namespace content {
// static
bool WebPackageRequestHandler::IsSupportedMimeType(
const std::string& mime_type) {
DCHECK(base::FeatureList::IsEnabled(features::kSignedHTTPExchange));
return mime_type == "application/http-exchange+cbor";
}
WebPackageRequestHandler::WebPackageRequestHandler() : weak_factory_(this) {
DCHECK(base::FeatureList::IsEnabled(features::kSignedHTTPExchange));
}
WebPackageRequestHandler::~WebPackageRequestHandler() = default;
void WebPackageRequestHandler::MaybeCreateLoader(
const network::ResourceRequest& resource_request,
ResourceContext* resource_context,
LoaderCallback callback) {
// TODO(https://crbug.com/80374): Ask WebPackageFetchManager to get the
// ongoing matching SignedExchangeHandler which was created by a
// WebPackagePrefetcher.
if (!web_package_loader_) {
std::move(callback).Run(StartLoaderCallback());
return;
}
std::move(callback).Run(base::BindOnce(
&WebPackageRequestHandler::StartResponse, weak_factory_.GetWeakPtr()));
}
bool WebPackageRequestHandler::MaybeCreateLoaderForResponse(
const network::ResourceResponseHead& response,
network::mojom::URLLoaderPtr* loader,
network::mojom::URLLoaderClientRequest* client_request,
ThrottlingURLLoader* url_loader) {
std::string mime_type;
if (response.was_fetched_via_service_worker || !response.headers ||
!response.headers->GetMimeType(&mime_type) ||
!IsSupportedMimeType(mime_type)) {
return false;
}
network::mojom::URLLoaderClientPtr client;
*client_request = mojo::MakeRequest(&client);
// TODO(https://crbug.com/80374): Consider creating a new ThrottlingURLLoader
// or reusing the existing ThrottlingURLLoader by reattaching URLLoaderClient,
// to support SafeBrowsing checking of the content of the WebPackage.
web_package_loader_ = base::MakeUnique<WebPackageLoader>(
response, std::move(client), url_loader->Unbind());
return true;
}
void WebPackageRequestHandler::StartResponse(
network::mojom::URLLoaderRequest request,
network::mojom::URLLoaderClientPtr client) {
web_package_loader_->ConnectToClient(std::move(client));
mojo::MakeStrongBinding(std::move(web_package_loader_), std::move(request));
}
} // namespace content