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

Unified Diff: net/base/upload_data_stream.cc

Issue 1250002: Report unreadable files as size zero when uploading. (Closed)
Patch Set: Address comments Created 10 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/base/upload_data_stream.h ('k') | net/base/upload_data_stream_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/upload_data_stream.cc
diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc
index a3a67fa09a7094eee0dd26790db70bc0e7daa1ee..140aa8a372b2a885d72fe7291d66be183a300c75 100644
--- a/net/base/upload_data_stream.cc
+++ b/net/base/upload_data_stream.cc
@@ -11,8 +11,7 @@
namespace net {
-UploadDataStream* UploadDataStream::Create(const UploadData* data,
- int* error_code) {
+UploadDataStream* UploadDataStream::Create(UploadData* data, int* error_code) {
scoped_ptr<UploadDataStream> stream(new UploadDataStream(data));
int rv = stream->FillBuf();
if (error_code)
@@ -23,11 +22,11 @@ UploadDataStream* UploadDataStream::Create(const UploadData* data,
return stream.release();
}
-UploadDataStream::UploadDataStream(const UploadData* data)
+UploadDataStream::UploadDataStream(UploadData* data)
: data_(data),
buf_(new IOBuffer(kBufSize)),
buf_len_(0),
- next_element_(data->elements().begin()),
+ next_element_(data->elements()->begin()),
next_element_offset_(0),
next_element_remaining_(0),
total_size_(data->GetContentLength()),
@@ -52,13 +51,13 @@ void UploadDataStream::DidConsume(size_t num_bytes) {
}
int UploadDataStream::FillBuf() {
- std::vector<UploadData::Element>::const_iterator end =
- data_->elements().end();
+ std::vector<UploadData::Element>::iterator end =
+ data_->elements()->end();
while (buf_len_ < kBufSize && next_element_ != end) {
bool advance_to_next_element = false;
- const UploadData::Element& element = *next_element_;
+ UploadData::Element& element = *next_element_;
size_t size_remaining = kBufSize - buf_len_;
if (element.type() == UploadData::TYPE_BYTES) {
@@ -78,57 +77,51 @@ int UploadDataStream::FillBuf() {
} else {
DCHECK(element.type() == UploadData::TYPE_FILE);
- // If the underlying file has been changed, treat it as error.
- // Note that the expected modification time from WebKit is based on
- // time_t precision. So we have to convert both to time_t to compare.
- if (!element.expected_file_modification_time().is_null()) {
- file_util::FileInfo info;
- if (file_util::GetFileInfo(element.file_path(), &info) &&
- element.expected_file_modification_time().ToTimeT() !=
- info.last_modified.ToTimeT()) {
- return ERR_UPLOAD_FILE_CHANGED;
- }
- }
-
- if (!next_element_stream_.IsOpen()) {
- int flags = base::PLATFORM_FILE_OPEN |
- base::PLATFORM_FILE_READ;
- int rv = next_element_stream_.Open(element.file_path(), flags);
- // If the file does not exist, that's technically okay.. we'll just
- // upload an empty file. This is for consistency with Mozilla.
- DLOG_IF(WARNING, rv != OK) << "Failed to open \""
- << element.file_path().value()
- << "\" for reading: " << rv;
-
- next_element_remaining_ = 0; // Default to reading nothing.
- if (rv == OK) {
- uint64 offset = element.file_range_offset();
- if (offset && next_element_stream_.Seek(FROM_BEGIN, offset) < 0) {
- DLOG(WARNING) << "Failed to seek \"" << element.file_path().value()
- << "\" to offset: " << offset;
- } else {
- next_element_remaining_ = element.file_range_length();
+ if (!next_element_remaining_) {
+ // If the underlying file has been changed, treat it as error.
+ // Note that the expected modification time from WebKit is based on
+ // time_t precision. So we have to convert both to time_t to compare.
+ if (!element.expected_file_modification_time().is_null()) {
+ file_util::FileInfo info;
+ if (file_util::GetFileInfo(element.file_path(), &info) &&
+ element.expected_file_modification_time().ToTimeT() !=
+ info.last_modified.ToTimeT()) {
+ return ERR_UPLOAD_FILE_CHANGED;
}
}
+ next_element_remaining_ = element.GetContentLength();
+ next_element_stream_.reset(element.NewFileStreamForReading());
}
int rv = 0;
- int count = static_cast<int>(std::min(
- static_cast<uint64>(size_remaining), next_element_remaining_));
- if (count > 0 &&
- (rv = next_element_stream_.Read(buf_->data() + buf_len_,
- count, NULL)) > 0) {
+ int count =
+ static_cast<int>(std::min(next_element_remaining_,
+ static_cast<uint64>(size_remaining)));
+ if (count > 0) {
+ if (next_element_stream_.get())
+ rv = next_element_stream_->Read(buf_->data() + buf_len_, count, NULL);
+ if (rv <= 0) {
+ // If there's less data to read than we initially observed, then
+ // pad with zero. Otherwise the server will hang waiting for the
+ // rest of the data.
+ memset(buf_->data() + buf_len_, 0, count);
+ rv = count;
+ }
buf_len_ += rv;
- next_element_remaining_ -= rv;
- } else {
+ }
+
+ if (static_cast<int>(next_element_remaining_) == rv) {
advance_to_next_element = true;
+ } else {
+ next_element_remaining_ -= rv;
}
}
if (advance_to_next_element) {
++next_element_;
next_element_offset_ = 0;
- next_element_stream_.Close();
+ next_element_remaining_ = 0;
+ next_element_stream_.reset();
}
}
« no previous file with comments | « net/base/upload_data_stream.h ('k') | net/base/upload_data_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698