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

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: Make UrlRequestFactory into a class that can create factories. Created 6 years, 2 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 bool CronetURLRequestAdapter::GetWasCached() const {
79 if (url_request_ == NULL)
80 return false;
81 return url_request_->response_info().was_cached;
82 }
83
84 void CronetURLRequestAdapter::Start() {
85 context_->GetNetworkTaskRunner()->PostTask(
86 FROM_HERE,
87 base::Bind(&CronetURLRequestAdapter::StartOnNetworkThread,
88 base::Unretained(this)));
89 }
90
91 void CronetURLRequestAdapter::FollowDeferredRedirect() {
92 context_->GetNetworkTaskRunner()->PostTask(
93 FROM_HERE,
94 base::Bind(
95 &CronetURLRequestAdapter::FollowDeferredRedirectOnNetworkThread,
96 base::Unretained(this)));
97 }
98
99 // Receive more data.
100 void CronetURLRequestAdapter::ReadData() {
101 context_->GetNetworkTaskRunner()->PostTask(
102 FROM_HERE,
103 base::Bind(
104 &CronetURLRequestAdapter::ReadDataOnNetworkThread,
105 base::Unretained(this)));
106 }
107
108 void CronetURLRequestAdapter::Cancel() {
109 if (canceled_) {
110 return;
111 }
112
113 canceled_ = true;
114
115 context_->GetNetworkTaskRunner()->PostTask(
116 FROM_HERE,
117 base::Bind(&CronetURLRequestAdapter::CancelOnNetworkThread,
118 base::Unretained(this)));
119 }
120
121 void CronetURLRequestAdapter::Destroy() {
122 context_->GetNetworkTaskRunner()->PostTask(
123 FROM_HERE, base::Bind(&CronetURLRequestAdapter::DestroyOnNetworkThread,
124 this));
125 }
126
127 // net::URLRequest::Delegate overrides (called on network thread).
128 void CronetURLRequestAdapter::OnReceivedRedirect(
129 net::URLRequest* request,
130 const net::RedirectInfo& redirect_info,
131 bool* defer_redirect) {
132 delegate_->OnRedirect(this, redirect_info.new_url);
133 *defer_redirect = true;
134 }
135
136 void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request) {
137 http_status_code_ = request->GetResponseCode();
138 delegate_->OnResponseStarted(this);
139 }
140
141 void CronetURLRequestAdapter::OnReadCompleted(net::URLRequest* request,
142 int bytes_read) {
143 if (bytes_read != 0) {
144 delegate_->OnBytesRead(this, bytes_read);
145 } else {
146 delegate_->OnRequestFinished(this, false);
147 }
148 }
149
150 void CronetURLRequestAdapter::StartOnNetworkThread() {
151 if (canceled_) {
152 return;
153 }
154
155 VLOG(1) << "Starting chromium request: "
156 << url_.possibly_invalid_spec().c_str()
157 << " priority: " << RequestPriorityToString(priority_);
158 url_request_ = context_->GetURLRequestContext()->CreateRequest(
159 url_, net::DEFAULT_PRIORITY, this, NULL);
160 url_request_->SetLoadFlags(net::LOAD_DISABLE_CACHE |
161 net::LOAD_DO_NOT_SAVE_COOKIES |
162 net::LOAD_DO_NOT_SEND_COOKIES);
163 url_request_->set_method(method_);
164 url_request_->SetExtraRequestHeaders(headers_);
165 if (!headers_.HasHeader(net::HttpRequestHeaders::kUserAgent)) {
166 std::string user_agent;
167 user_agent = context_->GetUserAgent(url_);
168 url_request_->SetExtraRequestHeaderByName(
169 net::HttpRequestHeaders::kUserAgent, user_agent, true /* override */);
170 }
171
172 url_request_->SetPriority(priority_);
173
174 url_request_->Start();
175 }
176
177 void CronetURLRequestAdapter::FollowDeferredRedirectOnNetworkThread() {
178 url_request_->FollowDeferredRedirect();
179 }
180
181 // Reads all available data or starts an asynchronous read.
182 void CronetURLRequestAdapter::ReadDataOnNetworkThread() {
183 int bytes_read = 0;
184 // If read completes synchronously, pass data to delegate.
185 if (url_request_->Read(read_buffer_, read_buffer_->size(), &bytes_read)) {
186 OnReadCompleted(url_request_.get(), bytes_read);
187 } else if (url_request_->status().status() !=
188 net::URLRequestStatus::IO_PENDING) {
189 OnReadCompleted(url_request_.get(), -1);
190 }
191 }
192
193 void CronetURLRequestAdapter::CancelOnNetworkThread() {
194 VLOG(1) << "Cancelling chromium request: " << url_.possibly_invalid_spec();
195
196 if (url_request_ != NULL) {
197 url_request_->Cancel();
198 }
199 delegate_->OnRequestFinished(this, true);
200 }
201
202 // static
203 void CronetURLRequestAdapter::DestroyOnNetworkThread(
204 CronetURLRequestAdapter* self) {
205 self->url_request_.reset();
206 VLOG(1) << "Destroying chromium request: "
207 << self->url_.possibly_invalid_spec();
208 delete self;
209 }
210
211 unsigned char* CronetURLRequestAdapter::Data() const {
212 return reinterpret_cast<unsigned char*>(read_buffer_->data());
213 }
214
215 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698