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

Side by Side Diff: components/cronet/android/cronet_url_request_adapter.cc

Issue 586143002: Initial implementation of Cronet Async API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cronet_url_request_adapter.h"
6
7 #include <string.h>
8
9 #include "base/bind.h"
10 #include "base/location.h"
11 #include "base/logging.h"
12 #include "base/strings/string_number_conversions.h"
13 #include "components/cronet/android/cronet_url_request_context_adapter.h"
14 #include "components/cronet/android/wrapped_channel_upload_element_reader.h"
15 #include "net/base/load_flags.h"
16 #include "net/base/upload_bytes_element_reader.h"
17 #include "net/http/http_status_code.h"
18 #include "net/url_request/redirect_info.h"
19
20 namespace cronet {
21
22 static const size_t kBufferSizeIncrement = 8192;
23
24 CronetURLRequestAdapter::CronetURLRequestAdapter(
25 CronetURLRequestContextAdapter* context,
26 CronetURLRequestAdapterDelegate* delegate,
27 GURL url,
28 net::RequestPriority priority)
29 : method_("GET"),
30 read_buffer_(new net::IOBufferWithSize(kBufferSizeIncrement)),
31 bytes_read_(0),
32 total_bytes_read_(0),
33 error_code_(0),
34 http_status_code_(0),
35 canceled_(false),
36 expected_size_(0),
37 chunked_upload_(false) {
38 context_ = context;
39 delegate_ = delegate;
40 url_ = url;
41 priority_ = priority;
42 }
43
44 CronetURLRequestAdapter::~CronetURLRequestAdapter() {
45 CHECK(url_request_ == NULL);
46 }
47
48 void CronetURLRequestAdapter::SetMethod(const std::string& method) {
49 method_ = method;
50 }
51
52 void CronetURLRequestAdapter::AddHeader(const std::string& name,
53 const std::string& value) {
54 headers_.SetHeader(name, value);
55 }
56
57 std::string CronetURLRequestAdapter::GetHeader(const std::string& name) const {
58 std::string value;
59 if (url_request_ != NULL) {
60 url_request_->GetResponseHeaderByName(name, &value);
61 }
62 return value;
63 }
64
65 net::HttpResponseHeaders* CronetURLRequestAdapter::GetResponseHeaders() const {
66 if (url_request_ == NULL) {
67 return NULL;
68 }
69 return url_request_->response_headers();
70 }
71
72 std::string CronetURLRequestAdapter::GetNegotiatedProtocol() const {
73 if (url_request_ == NULL)
74 return std::string();
75 return url_request_->response_info().npn_negotiated_protocol;
76 }
77
78 void CronetURLRequestAdapter::Start() {
79 context_->GetNetworkTaskRunner()->PostTask(
80 FROM_HERE,
81 base::Bind(&CronetURLRequestAdapter::StartOnNetworkThread,
82 base::Unretained(this)));
83 }
84
85 void CronetURLRequestAdapter::FollowDeferredRedirect() {
86 context_->GetNetworkTaskRunner()->PostTask(
87 FROM_HERE,
88 base::Bind(
89 &CronetURLRequestAdapter::FollowDeferredRedirectOnNetworkThread,
90 base::Unretained(this)));
91 }
92
93 // Receive more data.
94 void CronetURLRequestAdapter::ReadData() {
95 context_->GetNetworkTaskRunner()->PostTask(
96 FROM_HERE,
97 base::Bind(
98 &CronetURLRequestAdapter::ReadDataOnNetworkThread,
99 base::Unretained(this)));
100 }
101
102 void CronetURLRequestAdapter::Cancel() {
103 if (canceled_) {
104 return;
105 }
106
107 canceled_ = true;
108
109 context_->GetNetworkTaskRunner()->PostTask(
110 FROM_HERE,
111 base::Bind(&CronetURLRequestAdapter::CancelOnNetworkThread,
112 base::Unretained(this)));
113 }
114
115 void CronetURLRequestAdapter::Destroy() {
116 context_->GetNetworkTaskRunner()->PostTask(
117 FROM_HERE, base::Bind(&CronetURLRequestAdapter::DestroyOnNetworkThread,
118 this));
119 }
120
121 // net::URLRequest::Delegate overrides (called on network thread).
122 void CronetURLRequestAdapter::OnReceivedRedirect(
123 net::URLRequest* request,
124 const net::RedirectInfo& redirect_info,
125 bool* defer_redirect) {
126 delegate_->OnRedirect(this, redirect_info.new_url);
127 *defer_redirect = true;
128 }
129
130 void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request) {
131 delegate_->OnResponseStarted(this);
132 }
133
134 void CronetURLRequestAdapter::OnReadCompleted(net::URLRequest* request,
135 int bytes_read) {
136 if (bytes_read != 0) {
137 delegate_->OnBytesRead(this, bytes_read);
138 } else {
139 delegate_->OnRequestFinished(this);
140 }
141 }
142
143 void CronetURLRequestAdapter::StartOnNetworkThread() {
144 if (canceled_) {
145 return;
146 }
147
148 VLOG(1) << "Starting chromium request: "
149 << url_.possibly_invalid_spec().c_str()
150 << " priority: " << RequestPriorityToString(priority_);
151 url_request_ = context_->GetURLRequestContext()->CreateRequest(
152 url_, net::DEFAULT_PRIORITY, this, NULL);
153 url_request_->SetLoadFlags(net::LOAD_DISABLE_CACHE |
154 net::LOAD_DO_NOT_SAVE_COOKIES |
155 net::LOAD_DO_NOT_SEND_COOKIES);
156 url_request_->set_method(method_);
157 url_request_->SetExtraRequestHeaders(headers_);
158 if (!headers_.HasHeader(net::HttpRequestHeaders::kUserAgent)) {
159 std::string user_agent;
160 user_agent = context_->GetUserAgent(url_);
161 url_request_->SetExtraRequestHeaderByName(
162 net::HttpRequestHeaders::kUserAgent, user_agent, true /* override */);
163 }
164
165 url_request_->SetPriority(priority_);
166
167 url_request_->Start();
168 }
169
170 void CronetURLRequestAdapter::FollowDeferredRedirectOnNetworkThread() {
171 url_request_->FollowDeferredRedirect();
172 }
173
174 // Reads all available data or starts an asynchronous read.
175 void CronetURLRequestAdapter::ReadDataOnNetworkThread() {
176 int bytes_read = 0;
177 // If read completes synchronously, pass data to delegate.
178 if (url_request_->Read(read_buffer_, read_buffer_->size(), &bytes_read)) {
179 OnReadCompleted(url_request_.get(), bytes_read);
180 } else if (url_request_->status().status() !=
181 net::URLRequestStatus::IO_PENDING) {
182 OnReadCompleted(url_request_.get(), -1);
183 }
184 }
185
186 void CronetURLRequestAdapter::CancelOnNetworkThread() {
187 VLOG(1) << "Canceling chromium request: " << url_.possibly_invalid_spec();
188
189 if (url_request_ != NULL) {
190 url_request_->Cancel();
191 }
192 }
193
194 // static
195 void CronetURLRequestAdapter::DestroyOnNetworkThread(
196 CronetURLRequestAdapter* self) {
197 VLOG(1) << "Destroying chromium request: "
198 << self->url_.possibly_invalid_spec();
199 delete self;
200 }
201
202 unsigned char* CronetURLRequestAdapter::Data() const {
203 return reinterpret_cast<unsigned char*>(read_buffer_->data());
204 }
205
206 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698