blob: 1b6829e7f97e653bab118ab4d7737af8bd45ad44 [file] [log] [blame]
// Copyright 2018 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/web_package/mock_signed_exchange_handler.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/strings/stringprintf.h"
#include "content/browser/web_package/signed_exchange_cert_fetcher_factory.h"
#include "net/filter/source_stream.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_util.h"
namespace content {
MockSignedExchangeHandlerParams::MockSignedExchangeHandlerParams(
const GURL& outer_url,
SignedExchangeLoadResult result,
net::Error error,
const GURL& inner_url,
const std::string& mime_type,
std::vector<std::string> response_headers,
base::Optional<net::SHA256HashValue> header_integrity)
: outer_url(outer_url),
result(result),
error(error),
inner_url(inner_url),
mime_type(mime_type),
response_headers(std::move(response_headers)),
header_integrity(std::move(header_integrity)) {}
MockSignedExchangeHandlerParams::MockSignedExchangeHandlerParams(
const MockSignedExchangeHandlerParams& other) = default;
MockSignedExchangeHandlerParams::~MockSignedExchangeHandlerParams() = default;
MockSignedExchangeHandler::MockSignedExchangeHandler(
const MockSignedExchangeHandlerParams& params,
std::unique_ptr<net::SourceStream> body,
ExchangeHeadersCallback headers_callback)
: header_integrity_(params.header_integrity) {
network::ResourceResponseHead head;
if (params.error == net::OK) {
head.headers =
base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK");
head.mime_type = params.mime_type;
head.headers->AddHeader(
base::StringPrintf("Content-type: %s", params.mime_type.c_str()));
for (const auto& header : params.response_headers)
head.headers->AddHeader(header);
head.is_signed_exchange_inner_response = true;
}
base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(std::move(headers_callback), params.result, params.error,
params.inner_url, head, std::move(body)));
}
base::Optional<net::SHA256HashValue>
MockSignedExchangeHandler::ComputeHeaderIntegrity() const {
return header_integrity_;
}
MockSignedExchangeHandler::~MockSignedExchangeHandler() {}
MockSignedExchangeHandlerFactory::MockSignedExchangeHandlerFactory(
std::vector<MockSignedExchangeHandlerParams> params_list)
: params_list_(std::move(params_list)) {}
MockSignedExchangeHandlerFactory::~MockSignedExchangeHandlerFactory() = default;
std::unique_ptr<SignedExchangeHandler> MockSignedExchangeHandlerFactory::Create(
const GURL& outer_url,
std::unique_ptr<net::SourceStream> body,
ExchangeHeadersCallback headers_callback,
std::unique_ptr<SignedExchangeCertFetcherFactory> cert_fetcher_factory) {
for (const auto& params : params_list_) {
if (params.outer_url == outer_url) {
return std::make_unique<MockSignedExchangeHandler>(
params, std::move(body), std::move(headers_callback));
}
}
NOTREACHED();
return nullptr;
}
} // namespace content