| Index: components/cronet/android/url_request_adapter.cc
|
| diff --git a/components/cronet/android/url_request_adapter.cc b/components/cronet/android/url_request_adapter.cc
|
| index 8ab88a2f3cd766629e0033c3f231381992528f13..4b0b38dbb708cfab42bb90287b869156cfbc1443 100644
|
| --- a/components/cronet/android/url_request_adapter.cc
|
| +++ b/components/cronet/android/url_request_adapter.cc
|
| @@ -1,13 +1,18 @@
|
| // Copyright 2014 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| #include "url_request_adapter.h"
|
|
|
| +#include <string.h>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/location.h"
|
| +#include "base/logging.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "components/cronet/android/url_request_context_adapter.h"
|
| #include "components/cronet/android/wrapped_channel_upload_element_reader.h"
|
| #include "net/base/load_flags.h"
|
| #include "net/base/upload_bytes_element_reader.h"
|
| #include "net/http/http_status_code.h"
|
|
|
| @@ -23,15 +28,16 @@ URLRequestAdapter::URLRequestAdapter(URLRequestContextAdapter* context,
|
| url_request_(NULL),
|
| read_buffer_(new net::GrowableIOBuffer()),
|
| bytes_read_(0),
|
| total_bytes_read_(0),
|
| error_code_(0),
|
| http_status_code_(0),
|
| canceled_(false),
|
| - expected_size_(0) {
|
| + expected_size_(0),
|
| + chunked_upload_(false) {
|
| context_ = context;
|
| delegate_ = delegate;
|
| url_ = url;
|
| priority_ = priority;
|
| }
|
|
|
| URLRequestAdapter::~URLRequestAdapter() {
|
| @@ -58,14 +64,32 @@ void URLRequestAdapter::SetUploadContent(const char* bytes, int bytes_len) {
|
| void URLRequestAdapter::SetUploadChannel(JNIEnv* env, int64 content_length) {
|
| scoped_ptr<net::UploadElementReader> reader(
|
| new WrappedChannelElementReader(delegate_, content_length));
|
| upload_data_stream_.reset(
|
| net::UploadDataStream::CreateWithReader(reader.Pass(), 0));
|
| }
|
|
|
| +void URLRequestAdapter::EnableChunkedUpload() {
|
| + chunked_upload_ = true;
|
| +}
|
| +
|
| +void URLRequestAdapter::AppendChunk(const char* bytes, int bytes_len,
|
| + bool is_last_chunk) {
|
| + VLOG(1) << "AppendChunk, len: " << bytes_len << ", last: " << is_last_chunk;
|
| + scoped_ptr<char[]> buf(new char[bytes_len]);
|
| + memcpy(buf.get(), bytes, bytes_len);
|
| + context_->GetNetworkTaskRunner()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&URLRequestAdapter::OnAppendChunk,
|
| + base::Unretained(this),
|
| + Passed(buf.Pass()),
|
| + bytes_len,
|
| + is_last_chunk));
|
| +}
|
| +
|
| std::string URLRequestAdapter::GetHeader(const std::string& name) const {
|
| std::string value;
|
| if (url_request_ != NULL) {
|
| url_request_->GetResponseHeaderByName(name, &value);
|
| }
|
| return value;
|
| }
|
| @@ -80,14 +104,19 @@ net::HttpResponseHeaders* URLRequestAdapter::GetResponseHeaders() const {
|
| void URLRequestAdapter::Start() {
|
| context_->GetNetworkTaskRunner()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&URLRequestAdapter::OnInitiateConnection,
|
| base::Unretained(this)));
|
| }
|
|
|
| +void URLRequestAdapter::OnAppendChunk(const scoped_ptr<char[]> bytes,
|
| + int bytes_len, bool is_last_chunk) {
|
| + url_request_->AppendChunkToUpload(bytes.get(), bytes_len, is_last_chunk);
|
| +}
|
| +
|
| void URLRequestAdapter::OnInitiateConnection() {
|
| if (canceled_) {
|
| return;
|
| }
|
|
|
| VLOG(1) << "Starting chromium request: "
|
| << url_.possibly_invalid_spec().c_str()
|
| @@ -102,16 +131,19 @@ void URLRequestAdapter::OnInitiateConnection() {
|
| if (!headers_.HasHeader(net::HttpRequestHeaders::kUserAgent)) {
|
| std::string user_agent;
|
| user_agent = context_->GetUserAgent(url_);
|
| url_request_->SetExtraRequestHeaderByName(
|
| net::HttpRequestHeaders::kUserAgent, user_agent, true /* override */);
|
| }
|
|
|
| - if (upload_data_stream_)
|
| + if (upload_data_stream_) {
|
| url_request_->set_upload(upload_data_stream_.Pass());
|
| + } else if (chunked_upload_) {
|
| + url_request_->EnableChunkedUpload();
|
| + }
|
|
|
| url_request_->SetPriority(priority_);
|
|
|
| url_request_->Start();
|
| }
|
|
|
| void URLRequestAdapter::Cancel() {
|
|
|