blob: 8bff91084512f571a4465d821625972f03236f99 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/network/public/cpp/resource_request_body.h"
#include <utility>
#include <vector>
#include "base/check.h"
#include "base/memory/scoped_refptr.h"
#include "services/network/public/cpp/data_element.h"
#include "services/network/public/mojom/chunked_data_pipe_getter.mojom.h"
#include "services/network/public/mojom/data_pipe_getter.mojom.h"
#include "services/network/public/mojom/url_request.mojom-shared.h"
namespace network {
ResourceRequestBody::ResourceRequestBody()
: identifier_(0), contains_sensitive_info_(false) {}
// static
scoped_refptr<ResourceRequestBody> ResourceRequestBody::CreateFromCopyOfBytes(
base::span<const uint8_t> bytes) {
auto result = base::MakeRefCounted<ResourceRequestBody>();
result->AppendCopyOfBytes(bytes);
return result;
}
// static
scoped_refptr<ResourceRequestBody> ResourceRequestBody::CreateFromBytes(
std::vector<uint8_t>&& bytes) {
auto result = base::MakeRefCounted<ResourceRequestBody>();
result->AppendBytes(std::move(bytes));
return result;
}
bool ResourceRequestBody::EnableToAppendElement() const {
return elements_.empty() ||
(elements_.front().type() !=
mojom::DataElementDataView::Tag::kChunkedDataPipe);
}
void ResourceRequestBody::AppendBytes(std::vector<uint8_t>&& bytes) {
DCHECK(EnableToAppendElement());
if (bytes.size() > 0) {
elements_.emplace_back(DataElementBytes(std::move(bytes)));
}
}
void ResourceRequestBody::AppendCopyOfBytes(base::span<const uint8_t> bytes) {
AppendBytes(std::vector<uint8_t>(bytes.begin(), bytes.end()));
}
void ResourceRequestBody::AppendFileRange(
const base::FilePath& file_path,
uint64_t offset,
uint64_t length,
const base::Time& expected_modification_time) {
DCHECK(EnableToAppendElement());
elements_.emplace_back(
DataElementFile(file_path, offset, length, expected_modification_time));
}
void ResourceRequestBody::AppendDataPipe(
mojo::PendingRemote<mojom::DataPipeGetter> data_pipe_getter) {
DCHECK(EnableToAppendElement());
DCHECK(data_pipe_getter);
elements_.emplace_back(DataElementDataPipe(std::move(data_pipe_getter)));
}
void ResourceRequestBody::SetToChunkedDataPipe(
mojo::PendingRemote<mojom::ChunkedDataPipeGetter> chunked_data_pipe_getter,
ReadOnlyOnce read_only_once) {
DCHECK(elements_.empty());
DCHECK(chunked_data_pipe_getter);
elements_.emplace_back(DataElementChunkedDataPipe(
std::move(chunked_data_pipe_getter), read_only_once));
}
std::vector<base::FilePath> ResourceRequestBody::GetReferencedFiles() const {
std::vector<base::FilePath> result;
for (const auto& element : *elements()) {
if (element.type() == mojom::DataElementDataView::Tag::kFile) {
result.push_back(element.As<DataElementFile>().path());
}
}
return result;
}
ResourceRequestBody::~ResourceRequestBody() {}
} // namespace network