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 |
deleted file mode 100644 |
index 95d658e2e671a6376ea367a6f53f1b974f88ba3b..0000000000000000000000000000000000000000 |
--- a/components/cronet/android/url_request_adapter.cc |
+++ /dev/null |
@@ -1,339 +0,0 @@ |
-// 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 "components/cronet/android/url_request_adapter.h" |
- |
-#include <stddef.h> |
-#include <string.h> |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/location.h" |
-#include "base/logging.h" |
-#include "base/single_thread_task_runner.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/elements_upload_data_stream.h" |
-#include "net/base/load_flags.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/upload_bytes_element_reader.h" |
-#include "net/http/http_response_headers.h" |
-#include "net/http/http_status_code.h" |
- |
-namespace cronet { |
- |
-static const size_t kReadBufferSize = 32768; |
- |
-URLRequestAdapter::URLRequestAdapter(URLRequestContextAdapter* context, |
- URLRequestAdapterDelegate* delegate, |
- GURL url, |
- net::RequestPriority priority) |
- : method_("GET"), |
- total_bytes_read_(0), |
- error_code_(0), |
- http_status_code_(0), |
- canceled_(false), |
- expected_size_(0), |
- chunked_upload_(false), |
- disable_redirect_(false) { |
- context_ = context; |
- delegate_ = delegate; |
- url_ = url; |
- priority_ = priority; |
-} |
- |
-URLRequestAdapter::~URLRequestAdapter() { |
- DCHECK(OnNetworkThread()); |
- CHECK(url_request_ == NULL); |
-} |
- |
-void URLRequestAdapter::SetMethod(const std::string& method) { |
- method_ = method; |
-} |
- |
-void URLRequestAdapter::AddHeader(const std::string& name, |
- const std::string& value) { |
- headers_.SetHeader(name, value); |
-} |
- |
-void URLRequestAdapter::SetUploadContent(const char* bytes, int bytes_len) { |
- std::vector<char> data(bytes, bytes + bytes_len); |
- std::unique_ptr<net::UploadElementReader> reader( |
- new net::UploadOwnedBytesElementReader(&data)); |
- upload_data_stream_ = |
- net::ElementsUploadDataStream::CreateWithReader(std::move(reader), 0); |
-} |
- |
-void URLRequestAdapter::SetUploadChannel(JNIEnv* env, int64_t content_length) { |
- std::unique_ptr<net::UploadElementReader> reader( |
- new WrappedChannelElementReader(delegate_, content_length)); |
- upload_data_stream_ = |
- net::ElementsUploadDataStream::CreateWithReader(std::move(reader), 0); |
-} |
- |
-void URLRequestAdapter::DisableRedirects() { |
- disable_redirect_ = true; |
-} |
- |
-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; |
- std::unique_ptr<char[]> buf(new char[bytes_len]); |
- memcpy(buf.get(), bytes, bytes_len); |
- context_->PostTaskToNetworkThread( |
- FROM_HERE, |
- base::Bind(&URLRequestAdapter::OnAppendChunk, base::Unretained(this), |
- base::Passed(&buf), 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; |
-} |
- |
-net::HttpResponseHeaders* URLRequestAdapter::GetResponseHeaders() const { |
- if (url_request_ == NULL) { |
- return NULL; |
- } |
- return url_request_->response_headers(); |
-} |
- |
-std::string URLRequestAdapter::GetNegotiatedProtocol() const { |
- if (url_request_ == NULL) |
- return std::string(); |
- return url_request_->response_info().alpn_negotiated_protocol; |
-} |
- |
-bool URLRequestAdapter::GetWasCached() const { |
- if (url_request_ == NULL) |
- return false; |
- return url_request_->response_info().was_cached; |
-} |
- |
-void URLRequestAdapter::Start() { |
- context_->PostTaskToNetworkThread( |
- FROM_HERE, |
- base::Bind(&URLRequestAdapter::OnInitiateConnection, |
- base::Unretained(this))); |
-} |
- |
-void URLRequestAdapter::OnAppendChunk(const std::unique_ptr<char[]> bytes, |
- int bytes_len, |
- bool is_last_chunk) { |
- DCHECK(OnNetworkThread()); |
- // If AppendData returns false, the request has been cancelled or completed |
- // without uploading the entire request body. Either way, that result will |
- // have been sent to the embedder, so there's nothing else to do here. |
- chunked_upload_writer_->AppendData(bytes.get(), bytes_len, is_last_chunk); |
-} |
- |
-void URLRequestAdapter::OnInitiateConnection() { |
- DCHECK(OnNetworkThread()); |
- if (canceled_) { |
- return; |
- } |
- |
- VLOG(1) << "Starting chromium request: " |
- << url_.possibly_invalid_spec().c_str() |
- << " priority: " << RequestPriorityToString(priority_); |
- url_request_ = context_->GetURLRequestContext()->CreateRequest( |
- url_, net::DEFAULT_PRIORITY, this); |
- int flags = net::LOAD_DO_NOT_SAVE_COOKIES | net::LOAD_DO_NOT_SEND_COOKIES; |
- if (context_->load_disable_cache()) |
- flags |= net::LOAD_DISABLE_CACHE; |
- url_request_->SetLoadFlags(flags); |
- url_request_->set_method(method_); |
- url_request_->SetExtraRequestHeaders(headers_); |
- 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_) { |
- url_request_->set_upload(std::move(upload_data_stream_)); |
- } else if (chunked_upload_) { |
- std::unique_ptr<net::ChunkedUploadDataStream> chunked_upload_data_stream( |
- new net::ChunkedUploadDataStream(0)); |
- // Create a ChunkedUploadDataStream::Writer, which keeps a weak reference to |
- // the UploadDataStream, before passing ownership of the stream to the |
- // URLRequest. |
- chunked_upload_writer_ = chunked_upload_data_stream->CreateWriter(); |
- url_request_->set_upload(std::move(chunked_upload_data_stream)); |
- } |
- |
- url_request_->SetPriority(priority_); |
- |
- url_request_->Start(); |
-} |
- |
-void URLRequestAdapter::Cancel() { |
- context_->PostTaskToNetworkThread( |
- FROM_HERE, |
- base::Bind(&URLRequestAdapter::OnCancelRequest, base::Unretained(this))); |
-} |
- |
-void URLRequestAdapter::OnCancelRequest() { |
- DCHECK(OnNetworkThread()); |
- DCHECK(!canceled_); |
- VLOG(1) << "Canceling chromium request: " << url_.possibly_invalid_spec(); |
- canceled_ = true; |
- // Check whether request has already completed. |
- if (url_request_ == nullptr) |
- return; |
- |
- url_request_->Cancel(); |
- OnRequestCompleted(); |
-} |
- |
-void URLRequestAdapter::Destroy() { |
- context_->PostTaskToNetworkThread( |
- FROM_HERE, base::Bind(&URLRequestAdapter::OnDestroyRequest, this)); |
-} |
- |
-// static |
-void URLRequestAdapter::OnDestroyRequest(URLRequestAdapter* self) { |
- DCHECK(self->OnNetworkThread()); |
- VLOG(1) << "Destroying chromium request: " |
- << self->url_.possibly_invalid_spec(); |
- delete self; |
-} |
- |
-// static |
-void URLRequestAdapter::OnResponseStarted(net::URLRequest* request, |
- int net_error) { |
- DCHECK_NE(net::ERR_IO_PENDING, net_error); |
- DCHECK(OnNetworkThread()); |
- |
- if (net_error != net::OK) { |
- OnRequestFailed(net_error); |
- return; |
- } |
- |
- http_status_code_ = request->GetResponseCode(); |
- VLOG(1) << "Response started with status: " << http_status_code_; |
- |
- net::HttpResponseHeaders* headers = request->response_headers(); |
- if (headers) |
- http_status_text_ = headers->GetStatusText(); |
- |
- request->GetResponseHeaderByName("Content-Type", &content_type_); |
- expected_size_ = request->GetExpectedContentSize(); |
- delegate_->OnResponseStarted(this); |
- |
- Read(); |
-} |
- |
-// Reads all available data or starts an asynchronous read. |
-void URLRequestAdapter::Read() { |
- DCHECK(OnNetworkThread()); |
- if (!read_buffer_.get()) |
- read_buffer_ = new net::IOBufferWithSize(kReadBufferSize); |
- |
- while(true) { |
- int result = url_request_->Read(read_buffer_.get(), kReadBufferSize); |
- // If IO is pending, wait for the URLRequest to call OnReadCompleted. |
- if (result == net::ERR_IO_PENDING) |
- return; |
- // Stop when request has failed or succeeded. |
- if (!HandleReadResult(result)) |
- return; |
- } |
-} |
- |
-bool URLRequestAdapter::HandleReadResult(int result) { |
- DCHECK(OnNetworkThread()); |
- if (result < 0) { |
- OnRequestFailed(result); |
- return false; |
- } |
- |
- if (result == 0) { |
- OnRequestSucceeded(); |
- return false; |
- } |
- |
- total_bytes_read_ += result; |
- delegate_->OnBytesRead(this, result); |
- |
- return true; |
-} |
- |
-void URLRequestAdapter::OnReadCompleted(net::URLRequest* request, |
- int bytes_read) { |
- DCHECK_NE(net::ERR_IO_PENDING, bytes_read); |
- if (!HandleReadResult(bytes_read)) |
- return; |
- |
- Read(); |
-} |
- |
-void URLRequestAdapter::OnReceivedRedirect(net::URLRequest* request, |
- const net::RedirectInfo& info, |
- bool* defer_redirect) { |
- DCHECK(OnNetworkThread()); |
- if (disable_redirect_) { |
- http_status_code_ = request->GetResponseCode(); |
- request->CancelWithError(net::ERR_TOO_MANY_REDIRECTS); |
- error_code_ = net::ERR_TOO_MANY_REDIRECTS; |
- canceled_ = true; |
- *defer_redirect = false; |
- OnRequestCompleted(); |
- } |
-} |
- |
-void URLRequestAdapter::OnRequestSucceeded() { |
- DCHECK(OnNetworkThread()); |
- if (canceled_) { |
- return; |
- } |
- |
- VLOG(1) << "Request completed with HTTP status: " << http_status_code_ |
- << ". Total bytes read: " << total_bytes_read_; |
- |
- OnRequestCompleted(); |
-} |
- |
-void URLRequestAdapter::OnRequestFailed(int net_error) { |
- DCHECK_LE(net_error, 0); |
- DCHECK_NE(net::ERR_IO_PENDING, net_error); |
- DCHECK(OnNetworkThread()); |
- if (canceled_) { |
- return; |
- } |
- |
- error_code_ = net_error; |
- VLOG(1) << "Request failed with error: " << net::ErrorToString(error_code_); |
- OnRequestCompleted(); |
-} |
- |
-void URLRequestAdapter::OnRequestCompleted() { |
- DCHECK(OnNetworkThread()); |
- VLOG(1) << "Completed: " << url_.possibly_invalid_spec(); |
- |
- DCHECK(url_request_ != nullptr); |
- |
- delegate_->OnRequestFinished(this); |
- url_request_.reset(); |
-} |
- |
-unsigned char* URLRequestAdapter::Data() const { |
- DCHECK(OnNetworkThread()); |
- return reinterpret_cast<unsigned char*>(read_buffer_->data()); |
-} |
- |
-bool URLRequestAdapter::OnNetworkThread() const { |
- return context_->GetNetworkTaskRunner()->BelongsToCurrentThread(); |
-} |
- |
-} // namespace cronet |