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

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

Issue 6292013: Add chunked uploads support to SPDY (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years, 9 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"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 UploadData::Element& element = elements[next_element_]; 62 UploadData::Element& element = elements[next_element_];
63 63
64 size_t size_remaining = kBufSize - buf_len_; 64 size_t size_remaining = kBufSize - buf_len_;
65 if (element.type() == UploadData::TYPE_BYTES || 65 if (element.type() == UploadData::TYPE_BYTES ||
66 element.type() == UploadData::TYPE_CHUNK) { 66 element.type() == UploadData::TYPE_CHUNK) {
67 const std::vector<char>& d = element.bytes(); 67 const std::vector<char>& d = element.bytes();
68 size_t count = d.size() - next_element_offset_; 68 size_t count = d.size() - next_element_offset_;
69 69
70 size_t bytes_copied = std::min(count, size_remaining); 70 size_t bytes_copied = std::min(count, size_remaining);
71 71
72 memcpy(buf_->data() + buf_len_, &d[next_element_offset_], bytes_copied); 72 // Check if we have anything to copy first, because we are getting the
73 buf_len_ += bytes_copied; 73 // address of an element in |d| and that will throw an exception if |d|
74 // is an empty vector.
75 if (bytes_copied) {
76 memcpy(buf_->data() + buf_len_, &d[next_element_offset_], bytes_copied);
77 buf_len_ += bytes_copied;
78 }
74 79
75 if (bytes_copied == count) { 80 if (bytes_copied == count) {
76 advance_to_next_element = true; 81 advance_to_next_element = true;
77 } else { 82 } else {
78 next_element_offset_ += bytes_copied; 83 next_element_offset_ += bytes_copied;
79 } 84 }
80 } else { 85 } else {
81 DCHECK(element.type() == UploadData::TYPE_FILE); 86 DCHECK(element.type() == UploadData::TYPE_FILE);
82 87
83 if (!next_element_remaining_) { 88 if (!next_element_remaining_) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 if (next_element_ == elements.size() && !buf_len_) { 136 if (next_element_ == elements.size() && !buf_len_) {
132 if (!data_->is_chunked() || 137 if (!data_->is_chunked() ||
133 (!elements.empty() && elements.back().is_last_chunk())) { 138 (!elements.empty() && elements.back().is_last_chunk())) {
134 eof_ = true; 139 eof_ = true;
135 } 140 }
136 } 141 }
137 142
138 return OK; 143 return OK;
139 } 144 }
140 145
146 bool UploadDataStream::peek_end_of_chunks() const {
willchan no longer on Chromium 2011/03/03 19:47:48 This is not a trivial accessor. Also, this may be
147 std::vector<UploadData::Element>& elements = *data_->elements();
willchan no longer on Chromium 2011/03/03 19:47:48 Can you get away with a const reference?
148 if (!data_->is_chunked())
willchan no longer on Chromium 2011/03/03 19:47:48 If this doesn't depend on |elements|, then how abo
149 return false;
150 return (eof_ ||
151 (!elements.empty() &&
152 next_element_ >= elements.size() - 1 &&
willchan no longer on Chromium 2011/03/03 19:47:48 I find |next_element_ > elements.size()| more read
Satish 2011/03/03 22:21:44 The condition could only be changed as "next_eleme
willchan no longer on Chromium 2011/03/03 22:26:54 Oops, missed that! Bleh, off by one =/
153 elements.back().is_last_chunk()));
154 }
155
141 } // namespace net 156 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698