• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/base/upload_bytes_element_reader.h"
6 
7 #include "base/check_op.h"
8 #include "base/numerics/safe_conversions.h"
9 #include "net/base/io_buffer.h"
10 #include "net/base/net_errors.h"
11 
12 namespace net {
13 
UploadBytesElementReader(base::span<const uint8_t> bytes)14 UploadBytesElementReader::UploadBytesElementReader(
15     base::span<const uint8_t> bytes)
16     : bytes_(bytes) {}
17 
18 UploadBytesElementReader::~UploadBytesElementReader() = default;
19 
20 const UploadBytesElementReader*
AsBytesReader() const21 UploadBytesElementReader::AsBytesReader() const {
22   return this;
23 }
24 
Init(CompletionOnceCallback callback)25 int UploadBytesElementReader::Init(CompletionOnceCallback callback) {
26   offset_ = 0;
27   return OK;
28 }
29 
GetContentLength() const30 uint64_t UploadBytesElementReader::GetContentLength() const {
31   return bytes_.size();
32 }
33 
BytesRemaining() const34 uint64_t UploadBytesElementReader::BytesRemaining() const {
35   return bytes_.size() - offset_;
36 }
37 
IsInMemory() const38 bool UploadBytesElementReader::IsInMemory() const {
39   return true;
40 }
41 
Read(IOBuffer * buf,int buf_length,CompletionOnceCallback callback)42 int UploadBytesElementReader::Read(IOBuffer* buf,
43                                    int buf_length,
44                                    CompletionOnceCallback callback) {
45   base::span<const uint8_t> bytes_to_read =
46       bytes_.subspan(offset_, std::min(static_cast<size_t>(BytesRemaining()),
47                                        base::checked_cast<size_t>(buf_length)));
48   if (!bytes_to_read.empty()) {
49     buf->span().copy_prefix_from(bytes_to_read);
50   }
51 
52   offset_ += bytes_to_read.size();
53   return bytes_to_read.size();
54 }
55 
UploadOwnedBytesElementReader(std::vector<char> * data)56 UploadOwnedBytesElementReader::UploadOwnedBytesElementReader(
57     std::vector<char>* data)
58     : UploadBytesElementReader(base::as_byte_span(*data)) {
59   data_.swap(*data);
60 }
61 
62 UploadOwnedBytesElementReader::~UploadOwnedBytesElementReader() = default;
63 
64 std::unique_ptr<UploadOwnedBytesElementReader>
CreateWithString(const std::string & string)65 UploadOwnedBytesElementReader::CreateWithString(const std::string& string) {
66   std::vector<char> data(string.begin(), string.end());
67   return std::make_unique<UploadOwnedBytesElementReader>(&data);
68 }
69 
70 }  // namespace net
71