Avi Drissman | 6459548 | 2022-09-14 20:52:29 | [diff] [blame] | 1 | // Copyright 2012 The Chromium Authors |
license.bot | bf09a50 | 2008-08-24 00:55:55 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 4 | |
| 5 | #include "net/base/upload_data_stream.h" |
| 6 | |
Hans Wennborg | 0924470b | 2020-04-27 21:08:05 | [diff] [blame] | 7 | #include "base/check_op.h" |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 8 | #include "base/values.h" |
[email protected] | 597cf6e | 2009-05-29 09:43:26 | [diff] [blame] | 9 | #include "net/base/io_buffer.h" |
[email protected] | 9396b25 | 2008-09-29 17:29:38 | [diff] [blame] | 10 | #include "net/base/net_errors.h" |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 11 | #include "net/log/net_log_event_type.h" |
[email protected] | 1eb89e8 | 2008-08-15 12:27:03 | [diff] [blame] | 12 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 13 | namespace net { |
| 14 | |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 15 | namespace { |
| 16 | |
Liam Brady | 0c65172 | 2023-02-24 23:48:20 | [diff] [blame] | 17 | base::Value::Dict NetLogInitEndInfoParams(int result, |
| 18 | int total_size, |
| 19 | bool is_chunked) { |
Matt Menke | f523f55 | 2022-06-02 17:07:58 | [diff] [blame] | 20 | base::Value::Dict dict; |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 21 | |
Matt Menke | f523f55 | 2022-06-02 17:07:58 | [diff] [blame] | 22 | dict.Set("net_error", result); |
| 23 | dict.Set("total_size", total_size); |
| 24 | dict.Set("is_chunked", is_chunked); |
Liam Brady | 0c65172 | 2023-02-24 23:48:20 | [diff] [blame] | 25 | return dict; |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 26 | } |
| 27 | |
Liam Brady | 0c65172 | 2023-02-24 23:48:20 | [diff] [blame] | 28 | base::Value::Dict CreateReadInfoParams(int current_position) { |
Matt Menke | f523f55 | 2022-06-02 17:07:58 | [diff] [blame] | 29 | base::Value::Dict dict; |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 30 | |
Matt Menke | f523f55 | 2022-06-02 17:07:58 | [diff] [blame] | 31 | dict.Set("current_position", current_position); |
Liam Brady | 0c65172 | 2023-02-24 23:48:20 | [diff] [blame] | 32 | return dict; |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 33 | } |
| 34 | |
| 35 | } // namespace |
| 36 | |
wtc | 69f8ea8 | 2015-06-04 00:08:13 | [diff] [blame] | 37 | UploadDataStream::UploadDataStream(bool is_chunked, int64_t identifier) |
Yutaka Hirano | c267fb24 | 2022-07-05 01:27:17 | [diff] [blame] | 38 | : UploadDataStream(is_chunked, /*has_null_source=*/false, identifier) {} |
| 39 | UploadDataStream::UploadDataStream(bool is_chunked, |
| 40 | bool has_null_source, |
| 41 | int64_t identifier) |
| 42 | : identifier_(identifier), |
| 43 | is_chunked_(is_chunked), |
| 44 | has_null_source_(has_null_source) {} |
[email protected] | 0ab2e24 | 2012-02-08 06:07:00 | [diff] [blame] | 45 | |
Chris Watkins | 68b1503 | 2017-12-01 03:07:13 | [diff] [blame] | 46 | UploadDataStream::~UploadDataStream() = default; |
[email protected] | d100e44f | 2011-01-26 22:47:11 | [diff] [blame] | 47 | |
Matt Menke | cc1d3a90 | 2018-02-05 18:27:33 | [diff] [blame] | 48 | int UploadDataStream::Init(CompletionOnceCallback callback, |
tfarina | 42834111 | 2016-09-22 13:38:20 | [diff] [blame] | 49 | const NetLogWithSource& net_log) { |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 50 | Reset(); |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 51 | DCHECK(!initialized_successfully_); |
| 52 | DCHECK(callback_.is_null()); |
| 53 | DCHECK(!callback.is_null() || IsInMemory()); |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 54 | net_log_ = net_log; |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 55 | net_log_.BeginEvent(NetLogEventType::UPLOAD_DATA_STREAM_INIT); |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 56 | |
| 57 | int result = InitInternal(net_log_); |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 58 | if (result == ERR_IO_PENDING) { |
| 59 | DCHECK(!IsInMemory()); |
Matt Menke | cc1d3a90 | 2018-02-05 18:27:33 | [diff] [blame] | 60 | callback_ = std::move(callback); |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 61 | } else { |
| 62 | OnInitCompleted(result); |
| 63 | } |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 64 | |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 65 | return result; |
[email protected] | df7adc6 | 2012-09-18 14:01:53 | [diff] [blame] | 66 | } |
| 67 | |
[email protected] | 5b76814b | 2012-10-17 10:15:17 | [diff] [blame] | 68 | int UploadDataStream::Read(IOBuffer* buf, |
| 69 | int buf_len, |
Matt Menke | cc1d3a90 | 2018-02-05 18:27:33 | [diff] [blame] | 70 | CompletionOnceCallback callback) { |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 71 | DCHECK(!callback.is_null() || IsInMemory()); |
[email protected] | d9896165 | 2012-09-11 20:27:21 | [diff] [blame] | 72 | DCHECK(initialized_successfully_); |
Yoichi Osato | 079c77d6 | 2025-06-13 02:27:51 | [diff] [blame] | 73 | CHECK(buf); |
[email protected] | 5b76814b | 2012-10-17 10:15:17 | [diff] [blame] | 74 | DCHECK_GT(buf_len, 0); |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 75 | |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 76 | net_log_.BeginEvent(NetLogEventType::UPLOAD_DATA_STREAM_READ, |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 77 | [&] { return CreateReadInfoParams(current_position_); }); |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 78 | |
| 79 | int result = 0; |
| 80 | if (!is_eof_) |
| 81 | result = ReadInternal(buf, buf_len); |
| 82 | |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 83 | if (result == ERR_IO_PENDING) { |
| 84 | DCHECK(!IsInMemory()); |
Matt Menke | cc1d3a90 | 2018-02-05 18:27:33 | [diff] [blame] | 85 | callback_ = std::move(callback); |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 86 | } else { |
Yoichi Osato | 490169c | 2024-06-24 08:46:09 | [diff] [blame] | 87 | if (result < ERR_IO_PENDING) { |
| 88 | LOG(ERROR) << "ReadInternal failed with Error: " << result; |
| 89 | } |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 90 | OnReadCompleted(result); |
| 91 | } |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 92 | |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 93 | return result; |
[email protected] | 5b76814b | 2012-10-17 10:15:17 | [diff] [blame] | 94 | } |
| 95 | |
[email protected] | 135e429 | 2012-01-24 17:45:18 | [diff] [blame] | 96 | bool UploadDataStream::IsEOF() const { |
[email protected] | d9896165 | 2012-09-11 20:27:21 | [diff] [blame] | 97 | DCHECK(initialized_successfully_); |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 98 | DCHECK(is_chunked_ || is_eof_ == (current_position_ == total_size_)); |
| 99 | return is_eof_; |
[email protected] | b2d26cfd | 2012-12-11 10:36:06 | [diff] [blame] | 100 | } |
| 101 | |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 102 | void UploadDataStream::Reset() { |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 103 | // If there's a pending callback, there's a pending init or read call that is |
| 104 | // being canceled. |
| 105 | if (!callback_.is_null()) { |
| 106 | if (!initialized_successfully_) { |
| 107 | // If initialization has not yet succeeded, this call is aborting |
| 108 | // initialization. |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 109 | net_log_.EndEventWithNetErrorCode( |
| 110 | NetLogEventType::UPLOAD_DATA_STREAM_INIT, ERR_ABORTED); |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 111 | } else { |
| 112 | // Otherwise, a read is being aborted. |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 113 | net_log_.EndEventWithNetErrorCode( |
| 114 | NetLogEventType::UPLOAD_DATA_STREAM_READ, ERR_ABORTED); |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 115 | } |
| 116 | } |
| 117 | |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 118 | current_position_ = 0; |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 119 | initialized_successfully_ = false; |
| 120 | is_eof_ = false; |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 121 | total_size_ = 0; |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 122 | callback_.Reset(); |
| 123 | ResetInternal(); |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 124 | } |
[email protected] | df7adc6 | 2012-09-18 14:01:53 | [diff] [blame] | 125 | |
wtc | 69f8ea8 | 2015-06-04 00:08:13 | [diff] [blame] | 126 | void UploadDataStream::SetSize(uint64_t size) { |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 127 | DCHECK(!initialized_successfully_); |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 128 | DCHECK(!is_chunked_); |
| 129 | total_size_ = size; |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 130 | } |
| 131 | |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 132 | void UploadDataStream::SetIsFinalChunk() { |
| 133 | DCHECK(initialized_successfully_); |
| 134 | DCHECK(is_chunked_); |
| 135 | DCHECK(!is_eof_); |
| 136 | is_eof_ = true; |
| 137 | } |
| 138 | |
| 139 | bool UploadDataStream::IsInMemory() const { |
| 140 | return false; |
| 141 | } |
| 142 | |
danakj | 7f767e6 | 2016-04-16 23:20:23 | [diff] [blame] | 143 | const std::vector<std::unique_ptr<UploadElementReader>>* |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 144 | UploadDataStream::GetElementReaders() const { |
Raul Tambre | 94493c65 | 2019-03-11 17:18:35 | [diff] [blame] | 145 | return nullptr; |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 146 | } |
| 147 | |
| 148 | void UploadDataStream::OnInitCompleted(int result) { |
| 149 | DCHECK_NE(ERR_IO_PENDING, result); |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 150 | DCHECK(!initialized_successfully_); |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 151 | DCHECK_EQ(0u, current_position_); |
| 152 | DCHECK(!is_eof_); |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 153 | |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 154 | if (result == OK) { |
| 155 | initialized_successfully_ = true; |
| 156 | if (!is_chunked_ && total_size_ == 0) |
| 157 | is_eof_ = true; |
[email protected] | e5d47734 | 2012-11-02 15:18:46 | [diff] [blame] | 158 | } |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 159 | |
Eric Roman | 06bd974 | 2019-07-13 15:19:13 | [diff] [blame] | 160 | net_log_.EndEvent(NetLogEventType::UPLOAD_DATA_STREAM_INIT, [&] { |
| 161 | return NetLogInitEndInfoParams(result, total_size_, is_chunked_); |
| 162 | }); |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 163 | |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 164 | if (!callback_.is_null()) |
Matt Menke | cc1d3a90 | 2018-02-05 18:27:33 | [diff] [blame] | 165 | std::move(callback_).Run(result); |
[email protected] | df7adc6 | 2012-09-18 14:01:53 | [diff] [blame] | 166 | } |
| 167 | |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 168 | void UploadDataStream::OnReadCompleted(int result) { |
[email protected] | 5b76814b | 2012-10-17 10:15:17 | [diff] [blame] | 169 | DCHECK(initialized_successfully_); |
maksim.sisov | 52fcdc5 | 2016-06-23 06:28:52 | [diff] [blame] | 170 | DCHECK(result != 0 || is_eof_); |
| 171 | DCHECK_NE(ERR_IO_PENDING, result); |
[email protected] | 5b76814b | 2012-10-17 10:15:17 | [diff] [blame] | 172 | |
maksim.sisov | 52fcdc5 | 2016-06-23 06:28:52 | [diff] [blame] | 173 | if (result > 0) { |
| 174 | current_position_ += result; |
| 175 | if (!is_chunked_) { |
| 176 | DCHECK_LE(current_position_, total_size_); |
| 177 | if (current_position_ == total_size_) |
| 178 | is_eof_ = true; |
| 179 | } |
[email protected] | fac16e2 | 2012-12-29 18:46:31 | [diff] [blame] | 180 | } |
| 181 | |
mikecirone | 8b85c43 | 2016-09-08 19:11:00 | [diff] [blame] | 182 | net_log_.EndEventWithNetErrorCode(NetLogEventType::UPLOAD_DATA_STREAM_READ, |
maksim.sisov | 819ba85 | 2016-08-17 08:22:52 | [diff] [blame] | 183 | result); |
| 184 | |
mmenke | cbc2b71 | 2014-10-09 20:29:07 | [diff] [blame] | 185 | if (!callback_.is_null()) |
Matt Menke | cc1d3a90 | 2018-02-05 18:27:33 | [diff] [blame] | 186 | std::move(callback_).Run(result); |
[email protected] | fac16e2 | 2012-12-29 18:46:31 | [diff] [blame] | 187 | } |
| 188 | |
shivanisha | b9a14395 | 2016-09-19 17:23:41 | [diff] [blame] | 189 | UploadProgress UploadDataStream::GetUploadProgress() const { |
| 190 | // While initialization / rewinding is in progress, return nothing. |
| 191 | if (!initialized_successfully_) |
| 192 | return UploadProgress(); |
| 193 | |
| 194 | return UploadProgress(current_position_, total_size_); |
| 195 | } |
| 196 | |
Yoichi Osato | 4c75c0c | 2020-06-24 08:03:57 | [diff] [blame] | 197 | bool UploadDataStream::AllowHTTP1() const { |
| 198 | return true; |
| 199 | } |
| 200 | |
initial.commit | 586acc5fe | 2008-07-26 22:42:52 | [diff] [blame] | 201 | } // namespace net |