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

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

Issue 586143002: Initial implementation of Cronet Async API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address more comments. Created 6 years, 1 month 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 "components/cronet/android/cronet_url_request.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/android/scoped_java_ref.h"
10 #include "base/logging.h"
11 #include "base/macros.h"
12 #include "components/cronet/android/cronet_url_request_adapter.h"
13 #include "components/cronet/android/cronet_url_request_context_adapter.h"
14 #include "jni/CronetUrlRequest_jni.h"
15 #include "net/base/net_errors.h"
16 #include "net/base/request_priority.h"
17 #include "net/http/http_response_headers.h"
18 #include "net/http/http_util.h"
19
20 using base::android::ConvertUTF8ToJavaString;
21
22 namespace cronet {
23 namespace {
24
25 net::RequestPriority ConvertRequestPriority(jint request_priority) {
26 switch (request_priority) {
27 case CRONET_REQUEST_PRIORITY_IDLE:
28 return net::IDLE;
29 case CRONET_REQUEST_PRIORITY_LOWEST:
30 return net::LOWEST;
31 case CRONET_REQUEST_PRIORITY_LOW:
32 return net::LOW;
33 case CRONET_REQUEST_PRIORITY_MEDIUM:
34 return net::MEDIUM;
35 case CRONET_REQUEST_PRIORITY_HIGHEST:
36 return net::HIGHEST;
37 default:
38 return net::LOWEST;
39 }
40 }
41
42 // A delegate of CronetURLRequestAdapter that delivers callbacks to the Java
43 // layer. Always called on Network Thread.
44 class JniCronetURLRequestAdapterDelegate
45 : public CronetURLRequestAdapter::CronetURLRequestAdapterDelegate {
46 public:
47 JniCronetURLRequestAdapterDelegate(JNIEnv* jenv, jobject jowner) {
48 owner_.Reset(jenv, jowner);
49 }
50
51 void OnRedirect(const GURL& new_location) override {
52 JNIEnv* jenv = base::android::AttachCurrentThread();
53 cronet::Java_CronetUrlRequest_onRedirect(
54 jenv,
55 owner_.obj(),
56 ConvertUTF8ToJavaString(jenv, new_location.spec()).Release());
57 }
58
59 void OnResponseStarted() override {
60 JNIEnv* jenv = base::android::AttachCurrentThread();
61 cronet::Java_CronetUrlRequest_onResponseStarted(jenv, owner_.obj());
62 }
63
64 void OnBytesRead(unsigned char* bytes_buffer,
65 int bytes_read) override {
66 JNIEnv* jenv = base::android::AttachCurrentThread();
67 base::android::ScopedJavaLocalRef<jobject> java_buffer(
68 jenv, jenv->NewDirectByteBuffer(bytes_buffer, bytes_read));
69 cronet::Java_CronetUrlRequest_onDataReceived(
70 jenv, owner_.obj(), java_buffer.obj());
71 }
72
73 void OnRequestCanceled() override {
74 JNIEnv* jenv = base::android::AttachCurrentThread();
75 cronet::Java_CronetUrlRequest_onCanceled(jenv, owner_.obj());
76 }
77
78 void OnRequestFinished() override {
79 JNIEnv* jenv = base::android::AttachCurrentThread();
80 cronet::Java_CronetUrlRequest_onComplete(jenv, owner_.obj());
81 }
82
83 void OnError(int error) override {
84 JNIEnv* jenv = base::android::AttachCurrentThread();
85 cronet::Java_CronetUrlRequest_onError(
86 jenv,
87 owner_.obj(),
88 error,
89 ConvertUTF8ToJavaString(jenv, net::ErrorToString(error)).Release());
90 }
91
92 protected:
93 virtual ~JniCronetURLRequestAdapterDelegate() {
94 }
95
96 private:
97 base::android::ScopedJavaGlobalRef<jobject> owner_;
98
99 DISALLOW_COPY_AND_ASSIGN(JniCronetURLRequestAdapterDelegate);
100 };
101
102 } // namespace
103
104 // Explicitly register static JNI functions.
105 bool CronetUrlRequestRegisterJni(JNIEnv* jenv) {
106 return RegisterNativesImpl(jenv);
107 }
108
109 static jlong CreateRequestAdapter(JNIEnv* jenv,
110 jobject jurl_request,
111 jlong jurl_request_context_adapter,
112 jstring jurl_string,
113 jint jpriority) {
114 CronetURLRequestContextAdapter* context_adapter =
115 reinterpret_cast<CronetURLRequestContextAdapter*>(
116 jurl_request_context_adapter);
117 DCHECK(context_adapter != nullptr);
118
119 GURL url(base::android::ConvertJavaStringToUTF8(jenv, jurl_string));
120
121 VLOG(1) << "New chromium network request_adapter: "
122 << url.possibly_invalid_spec();
123
124 CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter(
125 context_adapter,
126 new JniCronetURLRequestAdapterDelegate(jenv, jurl_request),
127 url,
128 ConvertRequestPriority(jpriority));
129
130 return reinterpret_cast<jlong>(adapter);
131 }
132
133 static jboolean AddHeader(JNIEnv* jenv,
134 jobject jurl_request,
135 jlong jurl_request_adapter,
136 jstring jname,
137 jstring jvalue) {
138 CronetURLRequestAdapter* request_adapter =
139 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
140 std::string name(base::android::ConvertJavaStringToUTF8(jenv, jname));
141 std::string value(base::android::ConvertJavaStringToUTF8(jenv, jvalue));
142 DCHECK(request_adapter);
143 DCHECK(!request_adapter->IsOnNetworkThread());
144 if (!net::HttpUtil::IsValidHeaderName(name) ||
145 !net::HttpUtil::IsValidHeaderValue(value)) {
146 return false;
147 }
148 request_adapter->AddRequestHeader(name, value);
149 return true;
150 }
151
152 static void SetHttpMethod(JNIEnv* jenv,
153 jobject jurl_request,
154 jlong jurl_request_adapter,
155 jstring jmethod) {
156 CronetURLRequestAdapter* request_adapter =
157 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
158 std::string method(base::android::ConvertJavaStringToUTF8(jenv, jmethod));
159 DCHECK(request_adapter);
160 DCHECK(!request_adapter->IsOnNetworkThread());
161 request_adapter->SetMethod(method);
162 }
163
164 static void Start(JNIEnv* jenv,
165 jobject jurl_request,
166 jlong jurl_request_adapter) {
167 CronetURLRequestAdapter* request_adapter =
168 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
169 DCHECK(request_adapter);
170 DCHECK(!request_adapter->IsOnNetworkThread());
171 request_adapter->Start();
172 }
173
174 static void DestroyRequestAdapter(JNIEnv* jenv,
175 jobject jurl_request,
176 jlong jurl_request_adapter) {
177 CronetURLRequestAdapter* request_adapter =
178 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
179 DCHECK(request_adapter);
180 DCHECK(!request_adapter->IsOnNetworkThread());
181 request_adapter->Destroy();
182 }
183
184 static void Cancel(JNIEnv* jenv,
185 jobject jurl_request,
186 jlong jurl_request_adapter) {
187 CronetURLRequestAdapter* request_adapter =
188 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
189 DCHECK(request_adapter);
190 DCHECK(!request_adapter->IsOnNetworkThread());
191 request_adapter->Cancel();
192 }
193
194 static void ReceiveData(JNIEnv* jenv,
195 jobject jcaller,
196 jlong jurl_request_adapter) {
197 CronetURLRequestAdapter* request_adapter =
198 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
199 DCHECK(request_adapter);
200 DCHECK(!request_adapter->IsOnNetworkThread());
201 request_adapter->ReadData();
202 }
203
204 static void FollowDeferredRedirect(JNIEnv* jenv,
205 jobject jcaller,
206 jlong jurl_request_adapter) {
207 CronetURLRequestAdapter* request_adapter =
208 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
209 DCHECK(request_adapter);
210 DCHECK(!request_adapter->IsOnNetworkThread());
211 request_adapter->FollowDeferredRedirect();
212 }
213
214 static jint GetHttpStatusCode(JNIEnv* jenv,
215 jobject jurl_request,
216 jlong jurl_request_adapter) {
217 CronetURLRequestAdapter* request_adapter =
218 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
219 DCHECK(request_adapter);
220 DCHECK(request_adapter->IsOnNetworkThread());
221 return request_adapter->http_status_code();
222 }
223
224 static void PopulateResponseHeaders(JNIEnv* jenv,
225 jobject jurl_request,
226 jlong jurl_request_adapter,
227 jobject jheaders_map) {
228 CronetURLRequestAdapter* request_adapter =
229 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
230 DCHECK(request_adapter);
231 DCHECK(request_adapter->IsOnNetworkThread());
232
233 net::HttpResponseHeaders* headers = request_adapter->GetResponseHeaders();
234 if (headers == nullptr)
235 return;
236
237 void* iter = nullptr;
238 std::string header_name;
239 std::string header_value;
240 while (headers->EnumerateHeaderLines(&iter, &header_name, &header_value)) {
241 ScopedJavaLocalRef<jstring> name =
242 ConvertUTF8ToJavaString(jenv, header_name);
243 ScopedJavaLocalRef<jstring> value =
244 ConvertUTF8ToJavaString(jenv, header_value);
245 Java_CronetUrlRequest_onAppendResponseHeader(
246 jenv, jurl_request, jheaders_map, name.Release(), value.Release());
247 }
248
249 // Some implementations (notably HttpURLConnection) include a mapping for the
250 // null key; in HTTP's case, this maps to the HTTP status line.
251 ScopedJavaLocalRef<jstring> status_line =
252 ConvertUTF8ToJavaString(jenv, headers->GetStatusLine());
253 Java_CronetUrlRequest_onAppendResponseHeader(
254 jenv, jurl_request, jheaders_map, nullptr, status_line.Release());
255 }
256
257 static jstring GetNegotiatedProtocol(JNIEnv* jenv,
258 jobject jurl_request,
259 jlong jurl_request_adapter) {
260 CronetURLRequestAdapter* request_adapter =
261 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
262 DCHECK(request_adapter);
263 DCHECK(request_adapter->IsOnNetworkThread());
264 std::string negotiated_protocol = request_adapter->GetNegotiatedProtocol();
265 return ConvertUTF8ToJavaString(jenv, negotiated_protocol).Release();
266 }
267
268 static jboolean GetWasCached(JNIEnv* jenv,
269 jobject jurl_request,
270 jlong jurl_request_adapter) {
271 CronetURLRequestAdapter* request_adapter =
272 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
273 DCHECK(request_adapter);
274 DCHECK(request_adapter->IsOnNetworkThread());
275 return request_adapter->GetWasCached() ? JNI_TRUE : JNI_FALSE;
276 }
277
278 static jlong GetTotalReceivedBytes(JNIEnv* jenv,
279 jobject jurl_request,
280 jlong jurl_request_adapter) {
281 CronetURLRequestAdapter* request_adapter =
282 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
283 DCHECK(request_adapter);
284 DCHECK(request_adapter->IsOnNetworkThread());
285 return request_adapter->GetTotalReceivedBytes();
286 }
287
288 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698