blob: b0992205701ad0e0749e7f346cbd00d4d7b2b9f9 [file] [log] [blame]
// Copyright 2022 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/network_service_memory_cache_writer.h"
#include "base/trace_event/common/trace_event_common.h"
#include "base/trace_event/trace_event.h"
#include "base/trace_event/typed_macros.h"
#include "net/url_request/url_request.h"
#include "services/network/network_service_memory_cache.h"
namespace network {
NetworkServiceMemoryCacheWriter::NetworkServiceMemoryCacheWriter(
base::WeakPtr<NetworkServiceMemoryCache> cache,
uint64_t trace_id,
size_t max_bytes,
std::string cache_key,
net::URLRequest* url_request,
mojom::RequestDestination request_destination,
const net::TransportInfo& transport_info,
const mojom::URLResponseHeadPtr& response_head)
: cache_(std::move(cache)),
trace_id_(trace_id),
max_bytes_(max_bytes),
cache_key_(std::move(cache_key)),
url_request_(url_request),
request_destination_(request_destination),
transport_info_(transport_info),
response_head_(response_head.Clone()) {
DCHECK(cache_);
DCHECK(url_request_);
TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
"loading", "NetworkServiceMemoryCacheWriter", TRACE_ID_LOCAL(trace_id_),
"key", cache_key_);
}
NetworkServiceMemoryCacheWriter::~NetworkServiceMemoryCacheWriter() {
TRACE_EVENT_NESTABLE_ASYNC_END0("loading", "NetworkServiceMemoryCacheWriter",
TRACE_ID_LOCAL(trace_id_));
}
bool NetworkServiceMemoryCacheWriter::OnDataRead(const char* buf, int result) {
DCHECK_GT(result, 0);
TRACE_EVENT_NESTABLE_ASYNC_INSTANT1(
"loading", "NetworkServiceMemoryCacheWriter::OnDataRead",
TRACE_ID_LOCAL(trace_id_), "result", result);
DCHECK_GE(max_bytes_, received_data_.size());
if (static_cast<size_t>(result) > max_bytes_ - received_data_.size())
return false;
received_data_.insert(received_data_.end(), buf, buf + result);
return true;
}
void NetworkServiceMemoryCacheWriter::OnCompleted(
const URLLoaderCompletionStatus& status) {
TRACE_EVENT_NESTABLE_ASYNC_INSTANT2(
"loading", "NetworkServiceMemoryCacheWriter::OnCompleted",
TRACE_ID_LOCAL(trace_id_), "result", status.error_code, "total_size",
received_data_.size());
if (cache_) {
cache_->StoreResponse(cache_key_, status, request_destination_,
url_request_->response_info().vary_data,
transport_info_, std::move(response_head_),
std::move(received_data_));
}
// `this` will be deleted by the owner.
}
} // namespace network