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

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: Renamed UrlRequestFactory into UrlRequestContext, addressed some comments. 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 "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
19 using base::android::ConvertUTF8ToJavaString;
20
21 namespace cronet {
22 namespace {
23
24 net::RequestPriority ConvertRequestPriority(jint request_priority) {
25 switch (request_priority) {
26 case CRONET_REQUEST_PRIORITY_IDLE:
27 return net::IDLE;
28 case CRONET_REQUEST_PRIORITY_LOWEST:
29 return net::LOWEST;
30 case CRONET_REQUEST_PRIORITY_LOW:
31 return net::LOW;
32 case CRONET_REQUEST_PRIORITY_MEDIUM:
33 return net::MEDIUM;
34 case CRONET_REQUEST_PRIORITY_HIGHEST:
35 return net::HIGHEST;
36 default:
37 return net::LOWEST;
38 }
39 }
40
41 // A delegate of CronetURLRequestAdapter that delivers callbacks to the Java
42 // layer. Always called on Network Thread.
43 class JniCronetURLRequestAdapterDelegate
44 : public CronetURLRequestAdapter::CronetURLRequestAdapterDelegate {
45 public:
46 JniCronetURLRequestAdapterDelegate(JNIEnv* jenv, jobject jowner) {
47 owner_.Reset(jenv, jowner);
48 }
49
50 void OnRedirect(CronetURLRequestAdapter* request_adapter,
51 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(CronetURLRequestAdapter* request_adapter) override {
60 JNIEnv* jenv = base::android::AttachCurrentThread();
61 cronet::Java_CronetUrlRequest_onResponseStarted(jenv, owner_.obj());
62 }
63
64 void OnBytesRead(CronetURLRequestAdapter* request_adapter,
65 int bytes_read) override {
66 JNIEnv* jenv = base::android::AttachCurrentThread();
67 base::android::ScopedJavaLocalRef<jobject> java_buffer(
68 jenv, jenv->NewDirectByteBuffer(request_adapter->Data(), bytes_read));
69 cronet::Java_CronetUrlRequest_onDataReceived(
70 jenv, owner_.obj(), java_buffer.obj());
71 }
72
73 void OnRequestCanceled(CronetURLRequestAdapter* request_adapter) override {
74 JNIEnv* jenv = base::android::AttachCurrentThread();
75 cronet::Java_CronetUrlRequest_onCanceled(jenv, owner_.obj());
76 }
77
78 void OnRequestFinished(CronetURLRequestAdapter* request_adapter) override {
79 JNIEnv* jenv = base::android::AttachCurrentThread();
80 cronet::Java_CronetUrlRequest_onComplete(jenv, owner_.obj());
81 }
82
83 void OnError(CronetURLRequestAdapter* request_adapter, 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 void 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());
mmenke 2014/10/21 16:17:53 Check IsValidHeaderName and IsValidHeaderValue, an
mmenke 2014/10/21 17:39:18 Oh, and we should have tests for these (And most o
mef 2014/10/21 21:27:47 Done.
144 request_adapter->AddRequestHeader(name, value);
145 }
146
147 static void SetHttpMethod(JNIEnv* jenv,
148 jobject jurl_request,
149 jlong jurl_request_adapter,
150 jstring jmethod) {
151 CronetURLRequestAdapter* request_adapter =
152 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
153 std::string method(base::android::ConvertJavaStringToUTF8(jenv, jmethod));
154 DCHECK(request_adapter);
155 DCHECK(!request_adapter->IsOnNetworkThread());
156 request_adapter->SetMethod(method);
157 }
158
159 static void Start(JNIEnv* jenv,
160 jobject jurl_request,
161 jlong jurl_request_adapter) {
162 CronetURLRequestAdapter* request_adapter =
163 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
164 DCHECK(request_adapter);
165 DCHECK(!request_adapter->IsOnNetworkThread());
166 request_adapter->Start();
167 }
168
169 static void DestroyRequestAdapter(JNIEnv* jenv,
170 jobject jurl_request,
171 jlong jurl_request_adapter) {
172 CronetURLRequestAdapter* request_adapter =
173 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
174 DCHECK(request_adapter);
175 DCHECK(!request_adapter->IsOnNetworkThread());
176 request_adapter->Destroy();
177 }
178
179 static void Cancel(JNIEnv* jenv,
180 jobject jurl_request,
181 jlong jurl_request_adapter) {
182 CronetURLRequestAdapter* request_adapter =
183 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
184 DCHECK(request_adapter);
185 DCHECK(!request_adapter->IsOnNetworkThread());
186 request_adapter->Cancel();
187 }
188
189 static void ReceiveData(JNIEnv* jenv,
190 jobject jcaller,
191 jlong jurl_request_adapter) {
192 CronetURLRequestAdapter* request_adapter =
193 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
194 DCHECK(request_adapter);
195 DCHECK(!request_adapter->IsOnNetworkThread());
196 request_adapter->ReadData();
197 }
198
199 static void FollowDeferredRedirect(JNIEnv* jenv,
200 jobject jcaller,
201 jlong jurl_request_adapter) {
202 CronetURLRequestAdapter* request_adapter =
203 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
204 DCHECK(request_adapter);
205 DCHECK(!request_adapter->IsOnNetworkThread());
206 request_adapter->FollowDeferredRedirect();
207 }
208
209 static jint GetHttpStatusCode(JNIEnv* jenv,
210 jobject jurl_request,
211 jlong jurl_request_adapter) {
212 CronetURLRequestAdapter* request_adapter =
213 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
214 DCHECK(request_adapter);
215 DCHECK(request_adapter->IsOnNetworkThread());
216 return request_adapter->http_status_code();
217 }
218
219 static void GetAllHeaders(JNIEnv* jenv,
mmenke 2014/10/21 16:17:53 optional: May want to rename this (All the other
mef 2014/10/21 21:27:47 Done.
220 jobject jurl_request,
221 jlong jurl_request_adapter,
222 jobject jheaders_map) {
223 CronetURLRequestAdapter* request_adapter =
224 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
225 DCHECK(request_adapter);
226 DCHECK(request_adapter->IsOnNetworkThread());
227
228 net::HttpResponseHeaders* headers = request_adapter->GetResponseHeaders();
229 if (headers == nullptr)
230 return;
231
232 void* iter = nullptr;
233 std::string header_name;
234 std::string header_value;
235 while (headers->EnumerateHeaderLines(&iter, &header_name, &header_value)) {
236 ScopedJavaLocalRef<jstring> name =
237 ConvertUTF8ToJavaString(jenv, header_name);
238 ScopedJavaLocalRef<jstring> value =
239 ConvertUTF8ToJavaString(jenv, header_value);
240 Java_CronetUrlRequest_onAppendResponseHeader(
241 jenv, jurl_request, jheaders_map, name.Release(), value.Release());
242 }
243
244 // Some implementations (notably HttpURLConnection) include a mapping for the
245 // null key; in HTTP's case, this maps to the HTTP status line.
mmenke 2014/10/21 16:17:53 Maybe get rid of this behavior, and make the statu
mef 2014/10/21 21:27:47 Acknowledged.
246 ScopedJavaLocalRef<jstring> status_line =
247 ConvertUTF8ToJavaString(jenv, headers->GetStatusLine());
248 Java_CronetUrlRequest_onAppendResponseHeader(
249 jenv, jurl_request, jheaders_map, nullptr, status_line.Release());
250 }
251
252 static jstring GetNegotiatedProtocol(JNIEnv* jenv,
253 jobject jurl_request,
254 jlong jurl_request_adapter) {
255 CronetURLRequestAdapter* request_adapter =
256 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
257 DCHECK(request_adapter);
258 DCHECK(request_adapter->IsOnNetworkThread());
259 std::string negotiated_protocol = request_adapter->GetNegotiatedProtocol();
260 return ConvertUTF8ToJavaString(jenv, negotiated_protocol.c_str()).Release();
261 }
262
263 static jboolean GetWasCached(JNIEnv* jenv,
264 jobject jurl_request,
265 jlong jurl_request_adapter) {
266 CronetURLRequestAdapter* request_adapter =
267 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
268 DCHECK(request_adapter);
269 DCHECK(request_adapter->IsOnNetworkThread());
270 return request_adapter->GetWasCached() ? JNI_TRUE : JNI_FALSE;
271 }
272
273 static jlong GetTotalReceivedBytes(JNIEnv* jenv,
274 jobject jurl_request,
275 jlong jurl_request_adapter) {
276 CronetURLRequestAdapter* request_adapter =
277 reinterpret_cast<CronetURLRequestAdapter*>(jurl_request_adapter);
278 DCHECK(request_adapter);
279 DCHECK(request_adapter->IsOnNetworkThread());
280 return request_adapter->GetTotalReceivedBytes();
281 }
282
283 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698