summaryrefslogtreecommitdiffstats
path: root/chrome_frame
diff options
context:
space:
mode:
authorhashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-11 10:36:06 +0000
committerhashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-11 10:36:06 +0000
commitb2d26cfdcc1201f5e459ca3f9e0278e3fe45a45f (patch)
tree839657d1fc942a5976fe8a540c11bdf236f6fb22 /chrome_frame
parente2c00ede28ae5323b806a8fe1b108d020300e392 (diff)
downloadchromium_src-b2d26cfdcc1201f5e459ca3f9e0278e3fe45a45f.zip
chromium_src-b2d26cfdcc1201f5e459ca3f9e0278e3fe45a45f.tar.gz
chromium_src-b2d26cfdcc1201f5e459ca3f9e0278e3fe45a45f.tar.bz2
net: Make UploadDataStream independent from UploadData
Change argument of UploadDataStream's ctor from UploadData to ScopedVector<UploadElementReader> Move chunk related logic from UploadData to UploadDataStream. Move UploadElementReader creation code from UploadElementReader::Create to URLRequest::set_upload. (this code will soon be moved again to src/webkit/glue/resource_request_body.cc) BUG=156574 TEST=net_unittests TBR=jam@chromium.org for chrome/browser/automation (already reviewed by ananta@) Review URL: https://chromiumcodereview.appspot.com/11419220 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172295 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame')
-rw-r--r--chrome_frame/urlmon_upload_data_stream.cc57
1 files changed, 54 insertions, 3 deletions
diff --git a/chrome_frame/urlmon_upload_data_stream.cc b/chrome_frame/urlmon_upload_data_stream.cc
index 05a2b14..ede66bf 100644
--- a/chrome_frame/urlmon_upload_data_stream.cc
+++ b/chrome_frame/urlmon_upload_data_stream.cc
@@ -6,11 +6,62 @@
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
+#include "net/base/upload_bytes_element_reader.h"
+#include "net/base/upload_file_element_reader.h"
+
+namespace {
+
+// Creates UploadDataStream from UploadData.
+net::UploadDataStream* CreateUploadDataStream(net::UploadData* upload_data) {
+ net::UploadDataStream* upload_data_stream = NULL;
+ const ScopedVector<net::UploadElement>& elements = upload_data->elements();
+
+ if (upload_data->is_chunked()) {
+ // Use AppendChunk when data is chunked.
+ upload_data_stream = new net::UploadDataStream(
+ net::UploadDataStream::CHUNKED, upload_data->identifier());
+
+ for (size_t i = 0; i < elements.size(); ++i) {
+ const net::UploadElement& element = *elements[i];
+ const bool is_last_chunk =
+ i == elements.size() - 1 && upload_data->last_chunk_appended();
+ DCHECK_EQ(net::UploadElement::TYPE_BYTES, element.type());
+ upload_data_stream->AppendChunk(element.bytes(), element.bytes_length(),
+ is_last_chunk);
+ }
+ } else {
+ // Not chunked.
+ ScopedVector<net::UploadElementReader> element_readers;
+ for (size_t i = 0; i < elements.size(); ++i) {
+ const net::UploadElement& element = *elements[i];
+ net::UploadElementReader* reader = NULL;
+ switch (element.type()) {
+ case net::UploadElement::TYPE_BYTES:
+ reader = new net::UploadBytesElementReader(element.bytes(),
+ element.bytes_length());
+ break;
+ case net::UploadElement::TYPE_FILE:
+ reader = new net::UploadFileElementReader(
+ element.file_path(),
+ element.file_range_offset(),
+ element.file_range_length(),
+ element.expected_file_modification_time());
+ break;
+ }
+ DCHECK(reader);
+ element_readers.push_back(reader);
+ }
+ upload_data_stream = new net::UploadDataStream(&element_readers,
+ upload_data->identifier());
+ }
+ return upload_data_stream;
+}
+
+} // namespace
void UrlmonUploadDataStream::Initialize(net::UploadData* upload_data) {
upload_data_ = upload_data;
- request_body_stream_.reset(
- new net::UploadDataStream(upload_data));
+ request_body_stream_.reset(CreateUploadDataStream(upload_data));
const int result = request_body_stream_->InitSync();
DCHECK_EQ(net::OK, result);
}
@@ -69,7 +120,7 @@ STDMETHODIMP UrlmonUploadDataStream::Seek(LARGE_INTEGER move, DWORD origin,
// STREAM_SEEK_SETs to work with a 0 offset, but fail on everything else.
if (origin == STREAM_SEEK_SET && move.QuadPart == 0) {
if (request_body_stream_->position() != 0) {
- request_body_stream_.reset(new net::UploadDataStream(upload_data_));
+ request_body_stream_.reset(CreateUploadDataStream(upload_data_));
const int result = request_body_stream_->InitSync();
DCHECK_EQ(net::OK, result);
}