| Index: net/base/upload_data_stream.cc
|
| diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc
|
| index 221ef2899d8012b184401f088a9034532c34382a..9fca29ef267c0e14d8536c1dbcb9cb846e35c9eb 100644
|
| --- a/net/base/upload_data_stream.cc
|
| +++ b/net/base/upload_data_stream.cc
|
| @@ -10,7 +10,7 @@
|
|
|
| namespace net {
|
|
|
| -UploadDataStream::UploadDataStream(const UploadData* data)
|
| +UploadDataStream::UploadDataStream(UploadData* data)
|
| : data_(data),
|
| buf_(new IOBuffer(kBufSize)),
|
| buf_len_(0),
|
| @@ -67,18 +67,19 @@ void UploadDataStream::FillBuf() {
|
| } else {
|
| DCHECK(element.type() == UploadData::TYPE_FILE);
|
|
|
| - 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) {
|
| + if (element.file_range_length() == 0) {
|
| + // If we failed to open the file, then the length is set to zero. The
|
| + // length used when calculating the POST size was also zero. This
|
| + // matches the behaviour of Mozilla.
|
| + next_element_remaining_ = 0;
|
| + } else {
|
| + if (!next_element_stream_.IsOpen()) {
|
| + // We ignore the return value of Open becuase we've already checked
|
| + // !IsOpen, above.
|
| + int flags = base::PLATFORM_FILE_READ |
|
| + base::PLATFORM_FILE_WRITE;
|
| + next_element_stream_.Open(element.platform_file(), flags);
|
| +
|
| 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()
|
| @@ -90,11 +91,18 @@ void UploadDataStream::FillBuf() {
|
| }
|
|
|
| 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) {
|
| + if (next_element_remaining_ > 0) {
|
| + int count =
|
| + static_cast<int>(std::min(next_element_remaining_,
|
| + static_cast<uint64>(size_remaining)));
|
| + rv = next_element_stream_.Read(buf_->data() + buf_len_, count, NULL);
|
| + if (rv < 1) {
|
| + // If the file was truncated between the time that we opened it and
|
| + // now, or if we got an error on reading, then we pad with NULs.
|
| + memset(buf_->data() + buf_len_, 0, count);
|
| + rv = count;
|
| + }
|
| +
|
| buf_len_ += rv;
|
| next_element_remaining_ -= rv;
|
| } else {
|
| @@ -105,12 +113,14 @@ void UploadDataStream::FillBuf() {
|
| if (advance_to_next_element) {
|
| ++next_element_;
|
| next_element_offset_ = 0;
|
| - next_element_stream_.Close();
|
| + next_element_stream_.Release();
|
| }
|
| }
|
|
|
| - if (next_element_ == end && !buf_len_)
|
| + if (next_element_ == end && !buf_len_) {
|
| eof_ = true;
|
| + data_->CloseFiles();
|
| + }
|
| }
|
|
|
| } // namespace net
|
|
|