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

Side by Side Diff: net/base/upload_data_stream.cc

Issue 6134003: Prototype of chunked transfer encoded POST. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years, 11 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/upload_data_stream.h" 5 #include "net/base/upload_data_stream.h"
6 6
7 #include "base/file_util.h" 7 #include "base/file_util.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "net/base/file_stream.h" 9 #include "net/base/file_stream.h"
10 #include "net/base/io_buffer.h" 10 #include "net/base/io_buffer.h"
11 #include "net/base/net_errors.h" 11 #include "net/base/net_errors.h"
12 12
13 namespace net { 13 namespace net {
14 14
15 UploadDataStream::~UploadDataStream() {
16 }
17
18 UploadDataStream* UploadDataStream::Create(UploadData* data, int* error_code) { 15 UploadDataStream* UploadDataStream::Create(UploadData* data, int* error_code) {
19 scoped_ptr<UploadDataStream> stream(new UploadDataStream(data)); 16 scoped_ptr<UploadDataStream> stream(new UploadDataStream(data));
20 int rv = stream->FillBuf(); 17 int rv = stream->FillBuf();
21 if (error_code) 18 if (error_code)
22 *error_code = rv; 19 *error_code = rv;
23 if (rv != OK) 20 if (rv != OK)
24 return NULL; 21 return NULL;
25 22
26 return stream.release(); 23 return stream.release();
27 } 24 }
28 25
29 void UploadDataStream::DidConsume(size_t num_bytes) { 26 void UploadDataStream::MarkConsumedAndFillBuffer(size_t num_bytes) {
30 DCHECK_LE(num_bytes, buf_len_); 27 DCHECK_LE(num_bytes, buf_len_);
31 DCHECK(!eof_); 28 DCHECK(!eof_);
32 29
33 buf_len_ -= num_bytes; 30 if (num_bytes) {
34 if (buf_len_) 31 buf_len_ -= num_bytes;
35 memmove(buf_->data(), buf_->data() + num_bytes, buf_len_); 32 if (buf_len_)
33 memmove(buf_->data(), buf_->data() + num_bytes, buf_len_);
34 }
36 35
37 FillBuf(); 36 FillBuf();
38 37
39 current_position_ += num_bytes; 38 current_position_ += num_bytes;
40 } 39 }
41 40
42 UploadDataStream::UploadDataStream(UploadData* data) 41 UploadDataStream::UploadDataStream(UploadData* data)
43 : data_(data), 42 : data_(data),
44 buf_(new IOBuffer(kBufSize)), 43 buf_(new IOBuffer(kBufSize)),
45 buf_len_(0), 44 buf_len_(0),
46 next_element_(data->elements()->begin()), 45 next_element_(0),
47 next_element_offset_(0), 46 next_element_offset_(0),
48 next_element_remaining_(0), 47 next_element_remaining_(0),
49 total_size_(data->GetContentLength()), 48 total_size_(data->is_chunked() ? 0 : data->GetContentLength()),
50 current_position_(0), 49 current_position_(0),
51 eof_(false) { 50 eof_(false) {
52 } 51 }
53 52
53 UploadDataStream::~UploadDataStream() {
54 }
55
54 int UploadDataStream::FillBuf() { 56 int UploadDataStream::FillBuf() {
55 std::vector<UploadData::Element>::iterator end = 57 std::vector<UploadData::Element>& elements = *data_->elements();
56 data_->elements()->end();
57 58
58 while (buf_len_ < kBufSize && next_element_ != end) { 59 while (buf_len_ < kBufSize && next_element_ < elements.size()) {
59 bool advance_to_next_element = false; 60 bool advance_to_next_element = false;
60 61
61 UploadData::Element& element = *next_element_; 62 UploadData::Element& element = elements[next_element_];
62 63
63 size_t size_remaining = kBufSize - buf_len_; 64 size_t size_remaining = kBufSize - buf_len_;
64 if (element.type() == UploadData::TYPE_BYTES) { 65 if (element.type() == UploadData::TYPE_BYTES ||
66 element.type() == UploadData::TYPE_CHUNK) {
65 const std::vector<char>& d = element.bytes(); 67 const std::vector<char>& d = element.bytes();
66 size_t count = d.size() - next_element_offset_; 68 size_t count = d.size() - next_element_offset_;
67 69
68 size_t bytes_copied = std::min(count, size_remaining); 70 size_t bytes_copied = std::min(count, size_remaining);
69 71
70 memcpy(buf_->data() + buf_len_, &d[next_element_offset_], bytes_copied); 72 memcpy(buf_->data() + buf_len_, &d[next_element_offset_], bytes_copied);
71 buf_len_ += bytes_copied; 73 buf_len_ += bytes_copied;
72 74
73 if (bytes_copied == count) { 75 if (bytes_copied == count) {
74 advance_to_next_element = true; 76 advance_to_next_element = true;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 } 121 }
120 122
121 if (advance_to_next_element) { 123 if (advance_to_next_element) {
122 ++next_element_; 124 ++next_element_;
123 next_element_offset_ = 0; 125 next_element_offset_ = 0;
124 next_element_remaining_ = 0; 126 next_element_remaining_ = 0;
125 next_element_stream_.reset(); 127 next_element_stream_.reset();
126 } 128 }
127 } 129 }
128 130
129 if (next_element_ == end && !buf_len_) 131 if (next_element_ == elements.size() && !buf_len_) {
130 eof_ = true; 132 // If this is a chunked transfer encoded stream, the last element should
vandebo (ex-Chrome) 2011/01/24 20:16:08 This comment is out of date. Probably just remove
133 // have an empty bytes array to indicate the end of stream.
134 if (!data_->is_chunked() ||
135 (!elements.empty() && elements.back().is_last_chunk())) {
136 eof_ = true;
137 }
138 }
131 139
132 return OK; 140 return OK;
133 } 141 }
134 142
135 } // namespace net 143 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698