Index: net/base/upload_data_stream.cc |
diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc |
index 9f7bdbb419a28d63610b9235c0d5fcd9a6b5952e..4a056f43557b6da1f316bbce3661cf47f4cedcb9 100644 |
--- a/net/base/upload_data_stream.cc |
+++ b/net/base/upload_data_stream.cc |
@@ -12,6 +12,8 @@ |
namespace net { |
+bool UploadDataStream::merge_chunks_ = true; |
+ |
UploadDataStream::~UploadDataStream() { |
} |
@@ -69,8 +71,13 @@ int UploadDataStream::FillBuf() { |
size_t bytes_copied = std::min(count, size_remaining); |
- memcpy(buf_->data() + buf_len_, &d[next_element_offset_], bytes_copied); |
- buf_len_ += bytes_copied; |
+ // Check if we have anything to copy first, because we are getting the |
+ // address of an element in |d| and that will throw an exception if |d| |
+ // is an empty vector. |
+ if (bytes_copied) { |
+ memcpy(buf_->data() + buf_len_, &d[next_element_offset_], bytes_copied); |
+ buf_len_ += bytes_copied; |
+ } |
if (bytes_copied == count) { |
advance_to_next_element = true; |
@@ -126,6 +133,9 @@ int UploadDataStream::FillBuf() { |
next_element_remaining_ = 0; |
next_element_stream_.reset(); |
} |
+ |
+ if (is_chunked() && !merge_chunks_) |
+ break; |
} |
if (next_element_ == elements.size() && !buf_len_) { |
@@ -138,4 +148,13 @@ int UploadDataStream::FillBuf() { |
return OK; |
} |
+bool UploadDataStream::IsOnLastChunk() const { |
+ const std::vector<UploadData::Element>& elements = *data_->elements(); |
+ DCHECK(data_->is_chunked()); |
+ return (eof_ || |
+ (!elements.empty() && |
+ next_element_ == elements.size() && |
+ elements.back().is_last_chunk())); |
+} |
+ |
} // namespace net |