Chromium Code Reviews| Index: net/base/upload_data_stream.cc |
| diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc |
| index 0ec4c97b13b828bed2ce5e42651271102befc113..fd9aedf8565aa3c6662bb7f0fae5357f8600f20e 100644 |
| --- a/net/base/upload_data_stream.cc |
| +++ b/net/base/upload_data_stream.cc |
| @@ -12,9 +12,6 @@ |
| namespace net { |
| -UploadDataStream::~UploadDataStream() { |
| -} |
| - |
| UploadDataStream* UploadDataStream::Create(UploadData* data, int* error_code) { |
| scoped_ptr<UploadDataStream> stream(new UploadDataStream(data)); |
| int rv = stream->FillBuf(); |
| @@ -26,13 +23,15 @@ UploadDataStream* UploadDataStream::Create(UploadData* data, int* error_code) { |
| return stream.release(); |
| } |
| -void UploadDataStream::DidConsume(size_t num_bytes) { |
| +void UploadDataStream::ConsumeAndFillBuffer(size_t num_bytes) { |
| DCHECK_LE(num_bytes, buf_len_); |
| DCHECK(!eof_); |
| - buf_len_ -= num_bytes; |
| - if (buf_len_) |
| - memmove(buf_->data(), buf_->data() + num_bytes, buf_len_); |
| + if (num_bytes) { |
| + buf_len_ -= num_bytes; |
| + if (buf_len_) |
| + memmove(buf_->data(), buf_->data() + num_bytes, buf_len_); |
| + } |
| FillBuf(); |
| @@ -43,31 +42,39 @@ UploadDataStream::UploadDataStream(UploadData* data) |
| : data_(data), |
| buf_(new IOBuffer(kBufSize)), |
| buf_len_(0), |
| - next_element_(data->elements()->begin()), |
| + next_element_(0), |
| next_element_offset_(0), |
| next_element_remaining_(0), |
| - total_size_(data->GetContentLength()), |
| + total_size_(data->is_chunked() ? 0 : data->GetContentLength()), |
| current_position_(0), |
| eof_(false) { |
| } |
| +UploadDataStream::~UploadDataStream() { |
| +} |
| + |
| +void UploadDataStream::set_chunk_callback(ChunkCallback* callback) { |
| + data_->set_chunk_callback(callback); |
| +} |
| + |
| int UploadDataStream::FillBuf() { |
| - std::vector<UploadData::Element>::iterator end = |
| - data_->elements()->end(); |
| + std::vector<UploadData::Element>& elements = *data_->elements(); |
| - while (buf_len_ < kBufSize && next_element_ != end) { |
| + while (buf_len_ < kBufSize && next_element_ < elements.size()) { |
| bool advance_to_next_element = false; |
| - UploadData::Element& element = *next_element_; |
| + UploadData::Element& element = elements[next_element_]; |
| size_t size_remaining = kBufSize - buf_len_; |
| - if (element.type() == UploadData::TYPE_BYTES) { |
| + if (element.type() == UploadData::TYPE_BYTES || |
| + element.type() == UploadData::TYPE_CHUNK) { |
| const std::vector<char>& d = element.bytes(); |
| size_t count = d.size() - next_element_offset_; |
| size_t bytes_copied = std::min(count, size_remaining); |
| - memcpy(buf_->data() + buf_len_, &d[next_element_offset_], bytes_copied); |
| + if (bytes_copied) |
|
vandebo (ex-Chrome)
2011/01/21 18:08:41
nit: I think you can remove this now that you don'
|
| + memcpy(buf_->data() + buf_len_, &d[next_element_offset_], bytes_copied); |
| buf_len_ += bytes_copied; |
| if (bytes_copied == count) { |
| @@ -126,8 +133,14 @@ int UploadDataStream::FillBuf() { |
| } |
| } |
| - if (next_element_ == end && !buf_len_) |
| - eof_ = true; |
| + if (next_element_ == elements.size() && !buf_len_) { |
| + // If this is a chunked transfer encoded stream, the last element should |
| + // have an empty bytes array to indicate the end of stream. |
| + if (!data_->is_chunked() || |
| + (!elements.empty() && elements.back().is_last_chunk())) { |
| + eof_ = true; |
| + } |
| + } |
| return OK; |
| } |