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

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 review 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/macros.h"
10 #include "components/cronet/android/cronet_url_request_adapter.h"
11 #include "components/cronet/android/cronet_url_request_context_adapter.h"
12 #include "jni/CronetUrlRequest_jni.h"
13 #include "net/base/net_errors.h"
14 #include "net/base/request_priority.h"
15 #include "net/http/http_response_headers.h"
16
17 using base::android::ConvertUTF8ToJavaString;
18
19 namespace cronet {
20 namespace {
21
22 net::RequestPriority ConvertRequestPriority(jint request_priority) {
23 switch (request_priority) {
24 case CRONET_REQUEST_PRIORITY_IDLE:
25 return net::IDLE;
26 case CRONET_REQUEST_PRIORITY_LOWEST:
27 return net::LOWEST;
28 case CRONET_REQUEST_PRIORITY_LOW:
29 return net::LOW;
30 case CRONET_REQUEST_PRIORITY_MEDIUM:
31 return net::MEDIUM;
32 case CRONET_REQUEST_PRIORITY_HIGHEST:
33 return net::HIGHEST;
34 default:
35 return net::LOWEST;
36 }
37 }
mmenke 2014/10/06 18:28:43 nit: Blank line after function.
mef 2014/10/07 00:45:17 Done.
38 // A delegate of CronetURLRequestAdapter that delivers callbacks to the Java
39 // layer. Always called on Network Thread.
40 class JniCronetURLRequestAdapterDelegate
41 : public CronetURLRequestAdapter::CronetURLRequestAdapterDelegate {
42 public:
43 JniCronetURLRequestAdapterDelegate(JNIEnv* env, jobject owner) {
44 owner_ = env->NewGlobalRef(owner);
45 }
46
47 virtual void OnRedirect(CronetURLRequestAdapter* request,
48 const GURL& newLocation) OVERRIDE {
49 JNIEnv* env = base::android::AttachCurrentThread();
50 cronet::Java_CronetUrlRequest_onRedirect(
51 env,
52 owner_,
53 ConvertUTF8ToJavaString(env, newLocation.spec()).Release());
54 }
55
56 virtual void OnResponseStarted(CronetURLRequestAdapter* request) OVERRIDE {
57 JNIEnv* env = base::android::AttachCurrentThread();
58 cronet::Java_CronetUrlRequest_onResponseStarted(env, owner_);
59 }
60
61 virtual void OnBytesRead(CronetURLRequestAdapter* request,
62 int bytes_read) OVERRIDE {
63 JNIEnv* env = base::android::AttachCurrentThread();
64 base::android::ScopedJavaLocalRef<jobject> java_buffer(
65 env, env->NewDirectByteBuffer(request->Data(), bytes_read));
66 cronet::Java_CronetUrlRequest_onDataReceived(
67 env, owner_, java_buffer.obj());
68 }
69
70 virtual void OnRequestFinished(CronetURLRequestAdapter* request,
71 bool canceled) OVERRIDE {
72 JNIEnv* env = base::android::AttachCurrentThread();
73 cronet::Java_CronetUrlRequest_onComplete(
74 env, owner_, canceled ? JNI_TRUE : JNI_FALSE);
75 }
76
77 virtual void OnError(CronetURLRequestAdapter* request, int error) OVERRIDE {
78 JNIEnv* env = base::android::AttachCurrentThread();
79 cronet::Java_CronetUrlRequest_onError(env, owner_, error);
80 }
81
82 protected:
83 virtual ~JniCronetURLRequestAdapterDelegate() {
84 JNIEnv* env = base::android::AttachCurrentThread();
85 env->DeleteGlobalRef(owner_);
86 }
87
88 private:
89 jobject owner_;
90
91 DISALLOW_COPY_AND_ASSIGN(JniCronetURLRequestAdapterDelegate);
92 };
93
94 } // namespace
95
96 // Explicitly register static JNI functions.
97 bool CronetUrlRequestRegisterJni(JNIEnv* env) {
98 return RegisterNativesImpl(env);
99 }
100
101 static jlong CreateRequestAdapter(JNIEnv* env,
102 jobject object,
103 jlong url_request_context_adapter,
104 jstring url_string,
105 jint priority) {
106 CronetURLRequestContextAdapter* context =
107 reinterpret_cast<CronetURLRequestContextAdapter*>(
108 url_request_context_adapter);
109 DCHECK(context != NULL);
mmenke 2014/10/06 18:28:44 Can this be DCHECK_NE(nullptr, context); now?
mef 2014/10/07 00:45:17 Probably. Is there something special that's requir
110
111 GURL url(base::android::ConvertJavaStringToUTF8(env, url_string));
112
113 VLOG(1) << "New chromium network request: " << url.possibly_invalid_spec();
114
115 CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter(
116 context,
117 new JniCronetURLRequestAdapterDelegate(env, object),
118 url,
119 ConvertRequestPriority(priority));
120
121 return reinterpret_cast<jlong>(adapter);
122 }
123
124 static void AddHeader(JNIEnv* env,
125 jobject object,
126 jlong url_request_adapter,
127 jstring name,
128 jstring value) {
129 CronetURLRequestAdapter* request =
130 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
131 std::string name_string(base::android::ConvertJavaStringToUTF8(env, name));
132 std::string value_string(base::android::ConvertJavaStringToUTF8(env, value));
133
134 if (request != NULL)
mmenke 2014/10/06 18:28:44 Can this happen when the request is NULL? It does
mef 2014/10/07 00:45:17 Done.
135 request->AddHeader(name_string, value_string);
136 }
137
138 static void SetHttpMethod(JNIEnv* env,
139 jobject object,
140 jlong url_request_adapter,
141 jstring method) {
142 CronetURLRequestAdapter* request =
143 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
144 std::string method_string(
145 base::android::ConvertJavaStringToUTF8(env, method));
146
147 if (request != NULL)
148 request->SetMethod(method_string);
149 }
150
151 static void Start(JNIEnv* env, jobject object, jlong url_request_adapter) {
152 CronetURLRequestAdapter* request =
153 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
154 if (request != NULL)
155 request->Start();
156 }
157
158 static void DestroyRequestAdapter(JNIEnv* env,
159 jobject object,
160 jlong url_request_adapter) {
161 CronetURLRequestAdapter* request =
162 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
163 if (request != NULL)
164 request->Destroy();
165 }
166
167 static void Cancel(JNIEnv* env, jobject object, jlong url_request_adapter) {
168 CronetURLRequestAdapter* request =
169 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
170 if (request != NULL)
171 request->Cancel();
172 }
173
174 static void ReceiveData(JNIEnv* env,
175 jobject jcaller,
176 jlong url_request_adapter) {
177 CronetURLRequestAdapter* request =
178 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
179 if (request != NULL)
180 request->ReadData();
181 }
182
183 static void FollowDeferredRedirect(JNIEnv* env,
184 jobject jcaller,
185 jlong url_request_adapter) {
186 CronetURLRequestAdapter* request =
187 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
188 if (request != NULL)
189 request->FollowDeferredRedirect();
190 }
191
192 static jint GetHttpStatusCode(JNIEnv* env,
193 jobject object,
194 jlong url_request_adapter) {
195 CronetURLRequestAdapter* request =
196 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
197 if (request == NULL)
mmenke 2014/10/06 18:28:43 None of these accessors can be called when the req
mef 2014/10/07 00:45:17 Done.
198 return 0;
199 return request->http_status_code();
200 }
201
202 static jstring GetContentType(JNIEnv* env,
203 jobject object,
204 jlong url_request_adapter) {
205 CronetURLRequestAdapter* request =
206 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
207 if (request == NULL)
208 return NULL;
209 std::string type = request->content_type();
210 if (type.empty())
211 return NULL;
212 return ConvertUTF8ToJavaString(env, type.c_str()).Release();
213 }
214
215 static jlong GetContentLength(JNIEnv* env,
216 jobject object,
217 jlong url_request_adapter) {
218 CronetURLRequestAdapter* request =
219 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
220 if (request == NULL)
221 return 0;
222 return request->content_length();
223 }
224
225 static void GetAllHeaders(JNIEnv* env,
226 jobject object,
227 jlong url_request_adapter,
228 jobject headersMap) {
229 CronetURLRequestAdapter* request =
230 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
231 if (request == NULL)
232 return;
233
234 net::HttpResponseHeaders* headers = request->GetResponseHeaders();
235 if (headers == NULL)
236 return;
237
238 void* iter = NULL;
239 std::string header_name;
240 std::string header_value;
241 while (headers->EnumerateHeaderLines(&iter, &header_name, &header_value)) {
242 ScopedJavaLocalRef<jstring> name =
243 ConvertUTF8ToJavaString(env, header_name);
244 ScopedJavaLocalRef<jstring> value =
245 ConvertUTF8ToJavaString(env, header_value);
246 Java_CronetUrlRequest_onAppendResponseHeader(
247 env, object, headersMap, name.Release(), value.Release());
248 }
249
250 // Some implementations (notably HttpURLConnection) include a mapping for the
251 // null key; in HTTP's case, this maps to the HTTP status line.
252 ScopedJavaLocalRef<jstring> status_line =
253 ConvertUTF8ToJavaString(env, headers->GetStatusLine());
254 Java_CronetUrlRequest_onAppendResponseHeader(
255 env, object, headersMap, NULL, status_line.Release());
256 }
257
258 static jstring GetNegotiatedProtocol(JNIEnv* env,
259 jobject object,
260 jlong url_request_adapter) {
261 CronetURLRequestAdapter* request =
262 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
263 if (request == NULL)
264 return ConvertUTF8ToJavaString(env, "").Release();
265
266 std::string negotiated_protocol = request->GetNegotiatedProtocol();
267 return ConvertUTF8ToJavaString(env, negotiated_protocol.c_str()).Release();
268 }
269
270 static jboolean GetWasCached(JNIEnv* env,
271 jobject jcaller,
272 jlong url_request_adapter) {
273 CronetURLRequestAdapter* request =
274 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
275 if (request == NULL)
276 return JNI_FALSE;
277
278 return request->GetWasCached() ? JNI_TRUE : JNI_FALSE;
279 }
280
281 static jlong GetTotalReceivedBytes(JNIEnv* env,
282 jobject jcaller,
283 jlong url_request_adapter) {
284 CronetURLRequestAdapter* request =
285 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
286 if (request == NULL) {
287 return 0;
288 }
289 return request->GetTotalReceivedBytes();
290 }
291
292 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698