Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(874)

Side by Side Diff: net/base/elements_upload_data_stream.cc

Issue 2030353002: UploadDataStream now returns errors on failures (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed issues and combined with HttpStreamParser cl due to dependencies Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/elements_upload_data_stream.h" 5 #include "net/base/elements_upload_data_stream.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "net/base/completion_callback.h" 9 #include "net/base/completion_callback.h"
10 #include "net/base/io_buffer.h" 10 #include "net/base/io_buffer.h"
11 #include "net/base/net_errors.h" 11 #include "net/base/net_errors.h"
12 #include "net/base/upload_bytes_element_reader.h" 12 #include "net/base/upload_bytes_element_reader.h"
13 #include "net/base/upload_element_reader.h" 13 #include "net/base/upload_element_reader.h"
14 14
15 namespace net { 15 namespace net {
16 16
17 ElementsUploadDataStream::ElementsUploadDataStream( 17 ElementsUploadDataStream::ElementsUploadDataStream(
18 std::vector<std::unique_ptr<UploadElementReader>> element_readers, 18 std::vector<std::unique_ptr<UploadElementReader>> element_readers,
19 int64_t identifier) 19 int64_t identifier)
20 : UploadDataStream(false, identifier), 20 : UploadDataStream(false, identifier),
21 element_readers_(std::move(element_readers)), 21 element_readers_(std::move(element_readers)),
22 element_index_(0), 22 element_index_(0),
23 read_failed_(false), 23 read_error_(OK),
24 weak_ptr_factory_(this) {} 24 weak_ptr_factory_(this) {}
25 25
26 ElementsUploadDataStream::~ElementsUploadDataStream() { 26 ElementsUploadDataStream::~ElementsUploadDataStream() {
27 } 27 }
28 28
29 std::unique_ptr<UploadDataStream> ElementsUploadDataStream::CreateWithReader( 29 std::unique_ptr<UploadDataStream> ElementsUploadDataStream::CreateWithReader(
30 std::unique_ptr<UploadElementReader> reader, 30 std::unique_ptr<UploadElementReader> reader,
31 int64_t identifier) { 31 int64_t identifier) {
32 std::vector<std::unique_ptr<UploadElementReader>> readers; 32 std::vector<std::unique_ptr<UploadElementReader>> readers;
33 readers.push_back(std::move(reader)); 33 readers.push_back(std::move(reader));
(...skipping 20 matching lines...) Expand all
54 return true; 54 return true;
55 } 55 }
56 56
57 const std::vector<std::unique_ptr<UploadElementReader>>* 57 const std::vector<std::unique_ptr<UploadElementReader>>*
58 ElementsUploadDataStream::GetElementReaders() const { 58 ElementsUploadDataStream::GetElementReaders() const {
59 return &element_readers_; 59 return &element_readers_;
60 } 60 }
61 61
62 void ElementsUploadDataStream::ResetInternal() { 62 void ElementsUploadDataStream::ResetInternal() {
63 weak_ptr_factory_.InvalidateWeakPtrs(); 63 weak_ptr_factory_.InvalidateWeakPtrs();
64 read_failed_ = false; 64 read_error_ = OK;
65 element_index_ = 0; 65 element_index_ = 0;
66 } 66 }
67 67
68 int ElementsUploadDataStream::InitElements(size_t start_index) { 68 int ElementsUploadDataStream::InitElements(size_t start_index) {
69 // Call Init() for all elements. 69 // Call Init() for all elements.
70 for (size_t i = start_index; i < element_readers_.size(); ++i) { 70 for (size_t i = start_index; i < element_readers_.size(); ++i) {
71 UploadElementReader* reader = element_readers_[i].get(); 71 UploadElementReader* reader = element_readers_[i].get();
72 // When new_result is ERR_IO_PENDING, InitInternal() will be called 72 // When new_result is ERR_IO_PENDING, InitInternal() will be called
73 // with start_index == i + 1 when reader->Init() finishes. 73 // with start_index == i + 1 when reader->Init() finishes.
74 int result = reader->Init( 74 int result = reader->Init(
(...skipping 21 matching lines...) Expand all
96 // Check the last result. 96 // Check the last result.
97 if (result == OK) 97 if (result == OK)
98 result = InitElements(index + 1); 98 result = InitElements(index + 1);
99 99
100 if (result != ERR_IO_PENDING) 100 if (result != ERR_IO_PENDING)
101 OnInitCompleted(result); 101 OnInitCompleted(result);
102 } 102 }
103 103
104 int ElementsUploadDataStream::ReadElements( 104 int ElementsUploadDataStream::ReadElements(
105 const scoped_refptr<DrainableIOBuffer>& buf) { 105 const scoped_refptr<DrainableIOBuffer>& buf) {
106 while (!read_failed_ && element_index_ < element_readers_.size()) { 106 while (read_error_ == OK && element_index_ < element_readers_.size()) {
107 UploadElementReader* reader = element_readers_[element_index_].get(); 107 UploadElementReader* reader = element_readers_[element_index_].get();
108 108
109 if (reader->BytesRemaining() == 0) { 109 if (reader->BytesRemaining() == 0) {
110 ++element_index_; 110 ++element_index_;
111 continue; 111 continue;
112 } 112 }
113 113
114 if (buf->BytesRemaining() == 0) 114 if (buf->BytesRemaining() == 0)
115 break; 115 break;
116 116
117 int result = reader->Read( 117 int result = reader->Read(
118 buf.get(), 118 buf.get(),
119 buf->BytesRemaining(), 119 buf->BytesRemaining(),
120 base::Bind(&ElementsUploadDataStream::OnReadElementCompleted, 120 base::Bind(&ElementsUploadDataStream::OnReadElementCompleted,
121 weak_ptr_factory_.GetWeakPtr(), 121 weak_ptr_factory_.GetWeakPtr(),
122 buf)); 122 buf));
123 if (result == ERR_IO_PENDING) 123 if (result == ERR_IO_PENDING)
124 return ERR_IO_PENDING; 124 return ERR_IO_PENDING;
125 ProcessReadResult(buf, result); 125 ProcessReadResult(buf, result);
126 } 126 }
127 127
128 if (read_failed_) { 128 if (buf->BytesConsumed() > 0 && read_error_ == net::OK)
mmenke 2016/06/22 18:10:19 I don't think you need the read error check here -
129 // If an error occured during read operation, then pad with zero. 129 return buf->BytesConsumed();
130 // Otherwise the server will hang waiting for the rest of the data.
131 int num_bytes_to_fill =
132 static_cast<int>(std::min(static_cast<uint64_t>(buf->BytesRemaining()),
133 size() - position() - buf->BytesConsumed()));
134 DCHECK_GE(num_bytes_to_fill, 0);
135 memset(buf->data(), 0, num_bytes_to_fill);
136 buf->DidConsume(num_bytes_to_fill);
137 }
138 130
139 return buf->BytesConsumed(); 131 return read_error_;
140 } 132 }
141 133
142 void ElementsUploadDataStream::OnReadElementCompleted( 134 void ElementsUploadDataStream::OnReadElementCompleted(
143 const scoped_refptr<DrainableIOBuffer>& buf, 135 const scoped_refptr<DrainableIOBuffer>& buf,
144 int result) { 136 int result) {
145 ProcessReadResult(buf, result); 137 ProcessReadResult(buf, result);
146 138
147 result = ReadElements(buf); 139 result = ReadElements(buf);
148 if (result != ERR_IO_PENDING) 140 if (result != ERR_IO_PENDING)
149 OnReadCompleted(result); 141 OnReadCompleted(result);
150 } 142 }
151 143
152 void ElementsUploadDataStream::ProcessReadResult( 144 void ElementsUploadDataStream::ProcessReadResult(
153 const scoped_refptr<DrainableIOBuffer>& buf, 145 const scoped_refptr<DrainableIOBuffer>& buf,
154 int result) { 146 int result) {
155 DCHECK_NE(ERR_IO_PENDING, result); 147 DCHECK_NE(ERR_IO_PENDING, result);
156 DCHECK(!read_failed_); 148 DCHECK(!read_error_);
157 149
158 if (result >= 0) { 150 if (result >= 0) {
159 buf->DidConsume(result); 151 buf->DidConsume(result);
160 } else { 152 } else {
161 read_failed_ = true; 153 read_error_ = result;
162 } 154 }
163 } 155 }
164 156
165 } // namespace net 157 } // namespace net
OLDNEW
« no previous file with comments | « net/base/elements_upload_data_stream.h ('k') | net/base/elements_upload_data_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698