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

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, add mock errors to CronetUrlRequestTest. 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 }
38
39 // A delegate of CronetURLRequestAdapter that delivers callbacks to the Java
40 // layer. Always called on Network Thread.
41 class JniCronetURLRequestAdapterDelegate
42 : public CronetURLRequestAdapter::CronetURLRequestAdapterDelegate {
43 public:
44 JniCronetURLRequestAdapterDelegate(JNIEnv* env, jobject owner) {
45 owner_ = env->NewGlobalRef(owner);
46 }
47
48 void OnRedirect(CronetURLRequestAdapter* request,
49 const GURL& newLocation) override {
50 JNIEnv* env = base::android::AttachCurrentThread();
51 cronet::Java_CronetUrlRequest_onRedirect(
52 env,
53 owner_,
54 ConvertUTF8ToJavaString(env, newLocation.spec()).Release());
55 }
56
57 void OnResponseStarted(CronetURLRequestAdapter* request) override {
58 JNIEnv* env = base::android::AttachCurrentThread();
59 cronet::Java_CronetUrlRequest_onResponseStarted(env, owner_);
60 }
61
62 void OnBytesRead(CronetURLRequestAdapter* request, 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 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 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,
xunjieli 2014/10/17 00:31:34 nit: I learned from eroman@, that for arguments of
mef 2014/10/17 20:19:42 Ah, nice to know! Done.
104 jstring url_string,
105 jint priority) {
106 CronetURLRequestContextAdapter* context =
107 reinterpret_cast<CronetURLRequestContextAdapter*>(
108 url_request_context_adapter);
109 DCHECK(context != NULL);
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);
xunjieli 2014/10/17 00:31:34 nit: I find the naming is a little confusing. Here
mef 2014/10/17 20:19:42 sgtm, done.
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 DCHECK(request);
134 DCHECK(!request->IsOnNetworkThread());
135 request->AddRequestHeader(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 DCHECK(request);
147 DCHECK(!request->IsOnNetworkThread());
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 DCHECK(request);
155 DCHECK(!request->IsOnNetworkThread());
156 request->Start();
157 }
158
159 static void DestroyRequestAdapter(JNIEnv* env,
160 jobject object,
161 jlong url_request_adapter) {
162 CronetURLRequestAdapter* request =
163 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
164 DCHECK(request);
165 DCHECK(!request->IsOnNetworkThread());
166 request->Destroy();
167 }
168
169 static void Cancel(JNIEnv* env, jobject object, jlong url_request_adapter) {
170 CronetURLRequestAdapter* request =
171 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
172 DCHECK(request);
173 DCHECK(!request->IsOnNetworkThread());
174 request->Cancel();
175 }
176
177 static void ReceiveData(JNIEnv* env,
178 jobject jcaller,
179 jlong url_request_adapter) {
180 CronetURLRequestAdapter* request =
181 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
182 DCHECK(request);
183 DCHECK(!request->IsOnNetworkThread());
184 request->ReadData();
185 }
186
187 static void FollowDeferredRedirect(JNIEnv* env,
188 jobject jcaller,
189 jlong url_request_adapter) {
190 CronetURLRequestAdapter* request =
191 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
192 DCHECK(request);
193 DCHECK(!request->IsOnNetworkThread());
194 request->FollowDeferredRedirect();
195 }
196
197 static jint GetHttpStatusCode(JNIEnv* env,
198 jobject object,
199 jlong url_request_adapter) {
200 CronetURLRequestAdapter* request =
201 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
202 DCHECK(request);
203 DCHECK(request->IsOnNetworkThread());
204 return request->http_status_code();
205 }
206
207 static void GetAllHeaders(JNIEnv* env,
208 jobject object,
209 jlong url_request_adapter,
210 jobject headersMap) {
211 CronetURLRequestAdapter* request =
212 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
213 DCHECK(request);
214 DCHECK(request->IsOnNetworkThread());
215
216 net::HttpResponseHeaders* headers = request->GetResponseHeaders();
217 if (headers == NULL)
xunjieli 2014/10/17 00:31:34 nit: I think it is recommended for new code, nullp
mef 2014/10/17 20:19:41 Done.
218 return;
219
220 void* iter = NULL;
221 std::string header_name;
222 std::string header_value;
223 while (headers->EnumerateHeaderLines(&iter, &header_name, &header_value)) {
224 ScopedJavaLocalRef<jstring> name =
225 ConvertUTF8ToJavaString(env, header_name);
226 ScopedJavaLocalRef<jstring> value =
227 ConvertUTF8ToJavaString(env, header_value);
228 Java_CronetUrlRequest_onAppendResponseHeader(
229 env, object, headersMap, name.Release(), value.Release());
230 }
231
232 // Some implementations (notably HttpURLConnection) include a mapping for the
233 // null key; in HTTP's case, this maps to the HTTP status line.
234 ScopedJavaLocalRef<jstring> status_line =
235 ConvertUTF8ToJavaString(env, headers->GetStatusLine());
236 Java_CronetUrlRequest_onAppendResponseHeader(
237 env, object, headersMap, NULL, status_line.Release());
238 }
239
240 static jstring GetNegotiatedProtocol(JNIEnv* env,
241 jobject object,
242 jlong url_request_adapter) {
243 CronetURLRequestAdapter* request =
244 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
245 DCHECK(request);
246 DCHECK(request->IsOnNetworkThread());
247 std::string negotiated_protocol = request->GetNegotiatedProtocol();
248 return ConvertUTF8ToJavaString(env, negotiated_protocol.c_str()).Release();
249 }
250
251 static jboolean GetWasCached(JNIEnv* env,
252 jobject jcaller,
253 jlong url_request_adapter) {
254 CronetURLRequestAdapter* request =
255 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
256 DCHECK(request);
257 DCHECK(request->IsOnNetworkThread());
258 return request->GetWasCached() ? JNI_TRUE : JNI_FALSE;
259 }
260
261 static jlong GetTotalReceivedBytes(JNIEnv* env,
262 jobject jcaller,
263 jlong url_request_adapter) {
264 CronetURLRequestAdapter* request =
265 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
266 DCHECK(request);
267 DCHECK(request->IsOnNetworkThread());
268 return request->GetTotalReceivedBytes();
269 }
270
271 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698