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

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: Address clm's comments, populate ResponseInfo. 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 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 http_status_code_ = request->GetResponseCode();
132 delegate_->OnResponseStarted(this);
133 }
134
135 void CronetURLRequestAdapter::OnReadCompleted(net::URLRequest* request,
136 int bytes_read) {
137 if (bytes_read != 0) {
138 delegate_->OnBytesRead(this, bytes_read);
139 } else {
140 delegate_->OnRequestFinished(this, false);
141 }
142 }
143
144 void CronetURLRequestAdapter::StartOnNetworkThread() {
145 if (canceled_) {
146 return;
147 }
148
149 VLOG(1) << "Starting chromium request: "
150 << url_.possibly_invalid_spec().c_str()
151 << " priority: " << RequestPriorityToString(priority_);
152 url_request_ = context_->GetURLRequestContext()->CreateRequest(
153 url_, net::DEFAULT_PRIORITY, this, NULL);
154 url_request_->SetLoadFlags(net::LOAD_DISABLE_CACHE |
155 net::LOAD_DO_NOT_SAVE_COOKIES |
156 net::LOAD_DO_NOT_SEND_COOKIES);
157 url_request_->set_method(method_);
158 url_request_->SetExtraRequestHeaders(headers_);
159 if (!headers_.HasHeader(net::HttpRequestHeaders::kUserAgent)) {
160 std::string user_agent;
161 user_agent = context_->GetUserAgent(url_);
162 url_request_->SetExtraRequestHeaderByName(
163 net::HttpRequestHeaders::kUserAgent, user_agent, true /* override */);
164 }
165
166 url_request_->SetPriority(priority_);
167
168 url_request_->Start();
169 }
170
171 void CronetURLRequestAdapter::FollowDeferredRedirectOnNetworkThread() {
172 url_request_->FollowDeferredRedirect();
173 }
174
175 // Reads all available data or starts an asynchronous read.
176 void CronetURLRequestAdapter::ReadDataOnNetworkThread() {
177 int bytes_read = 0;
178 // If read completes synchronously, pass data to delegate.
179 if (url_request_->Read(read_buffer_, read_buffer_->size(), &bytes_read)) {
180 OnReadCompleted(url_request_.get(), bytes_read);
181 } else if (url_request_->status().status() !=
182 net::URLRequestStatus::IO_PENDING) {
183 OnReadCompleted(url_request_.get(), -1);
184 }
185 }
186
187 void CronetURLRequestAdapter::CancelOnNetworkThread() {
188 VLOG(1) << "Cancelling chromium request: " << url_.possibly_invalid_spec();
189
190 if (url_request_ != NULL) {
191 url_request_->Cancel();
192 }
193 delegate_->OnRequestFinished(this, true);
194 }
195
196 // static
197 void CronetURLRequestAdapter::DestroyOnNetworkThread(
198 CronetURLRequestAdapter* self) {
199 self->url_request_.reset();
200 VLOG(1) << "Destroying chromium request: "
201 << self->url_.possibly_invalid_spec();
202 delete self;
203 }
204
205 unsigned char* CronetURLRequestAdapter::Data() const {
206 return reinterpret_cast<unsigned char*>(read_buffer_->data());
207 }
208
209 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698