summaryrefslogtreecommitdiffstats
path: root/net/base/upload_data_stream.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/base/upload_data_stream.cc')
-rw-r--r--net/base/upload_data_stream.cc47
1 files changed, 28 insertions, 19 deletions
diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc
index 221ef28..0a0ee73 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),
@@ -24,6 +24,7 @@ UploadDataStream::UploadDataStream(const UploadData* data)
}
UploadDataStream::~UploadDataStream() {
+ data_->CloseFiles();
}
void UploadDataStream::DidConsume(size_t num_bytes) {
@@ -67,18 +68,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 +92,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,7 +114,7 @@ void UploadDataStream::FillBuf() {
if (advance_to_next_element) {
++next_element_;
next_element_offset_ = 0;
- next_element_stream_.Close();
+ next_element_stream_.Release();
}
}