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

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: Added ReportMockErrorFromQuery to URLRequestMockHTTPJob. 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 virtual 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 virtual void OnResponseStarted(CronetURLRequestAdapter* request) OVERRIDE {
58 JNIEnv* env = base::android::AttachCurrentThread();
59 cronet::Java_CronetUrlRequest_onResponseStarted(env, owner_);
60 }
61
62 virtual void OnBytesRead(CronetURLRequestAdapter* request,
63 int bytes_read) OVERRIDE {
64 JNIEnv* env = base::android::AttachCurrentThread();
65 base::android::ScopedJavaLocalRef<jobject> java_buffer(
66 env, env->NewDirectByteBuffer(request->Data(), bytes_read));
67 cronet::Java_CronetUrlRequest_onDataReceived(
68 env, owner_, java_buffer.obj());
69 }
70
71 virtual void OnRequestFinished(CronetURLRequestAdapter* request,
72 bool canceled) OVERRIDE {
73 JNIEnv* env = base::android::AttachCurrentThread();
74 cronet::Java_CronetUrlRequest_onComplete(
75 env, owner_, canceled ? JNI_TRUE : JNI_FALSE);
76 }
77
78 virtual void OnError(CronetURLRequestAdapter* request, int error) OVERRIDE {
79 JNIEnv* env = base::android::AttachCurrentThread();
80 cronet::Java_CronetUrlRequest_onError(env, owner_, error);
81 }
82
83 protected:
84 virtual ~JniCronetURLRequestAdapterDelegate() {
85 JNIEnv* env = base::android::AttachCurrentThread();
86 env->DeleteGlobalRef(owner_);
87 }
88
89 private:
90 jobject owner_;
91
92 DISALLOW_COPY_AND_ASSIGN(JniCronetURLRequestAdapterDelegate);
93 };
94
95 } // namespace
96
97 // Explicitly register static JNI functions.
98 bool CronetUrlRequestRegisterJni(JNIEnv* env) {
99 return RegisterNativesImpl(env);
100 }
101
102 static jlong CreateRequestAdapter(JNIEnv* env,
103 jobject object,
104 jlong url_request_context_adapter,
105 jstring url_string,
106 jint priority) {
107 CronetURLRequestContextAdapter* context =
108 reinterpret_cast<CronetURLRequestContextAdapter*>(
109 url_request_context_adapter);
110 DCHECK(context != NULL);
111
112 GURL url(base::android::ConvertJavaStringToUTF8(env, url_string));
113
114 VLOG(1) << "New chromium network request: " << url.possibly_invalid_spec();
115
116 CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter(
117 context,
118 new JniCronetURLRequestAdapterDelegate(env, object),
119 url,
120 ConvertRequestPriority(priority));
121
122 return reinterpret_cast<jlong>(adapter);
123 }
124
125 static void AddHeader(JNIEnv* env,
126 jobject object,
127 jlong url_request_adapter,
128 jstring name,
129 jstring value) {
130 CronetURLRequestAdapter* request =
131 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
132 std::string name_string(base::android::ConvertJavaStringToUTF8(env, name));
133 std::string value_string(base::android::ConvertJavaStringToUTF8(env, value));
134 DCHECK(request);
135 DCHECK(!request->IsOnNetworkThread());
136 request->AddRequestHeader(name_string, value_string);
137 }
138
139 static void SetHttpMethod(JNIEnv* env,
140 jobject object,
141 jlong url_request_adapter,
142 jstring method) {
143 CronetURLRequestAdapter* request =
144 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
145 std::string method_string(
146 base::android::ConvertJavaStringToUTF8(env, method));
147 DCHECK(request);
148 DCHECK(!request->IsOnNetworkThread());
149 request->SetMethod(method_string);
150 }
151
152 static void Start(JNIEnv* env, jobject object, jlong url_request_adapter) {
153 CronetURLRequestAdapter* request =
154 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
155 DCHECK(request);
156 DCHECK(!request->IsOnNetworkThread());
157 request->Start();
158 }
159
160 static void DestroyRequestAdapter(JNIEnv* env,
161 jobject object,
162 jlong url_request_adapter) {
163 CronetURLRequestAdapter* request =
164 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
165 DCHECK(request);
166 DCHECK(!request->IsOnNetworkThread());
167 request->Destroy();
168 }
169
170 static void Cancel(JNIEnv* env, jobject object, jlong url_request_adapter) {
171 CronetURLRequestAdapter* request =
172 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
173 DCHECK(request);
174 DCHECK(!request->IsOnNetworkThread());
175 request->Cancel();
176 }
177
178 static void ReceiveData(JNIEnv* env,
179 jobject jcaller,
180 jlong url_request_adapter) {
181 CronetURLRequestAdapter* request =
182 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
183 DCHECK(request);
184 DCHECK(!request->IsOnNetworkThread());
185 request->ReadData();
186 }
187
188 static void FollowDeferredRedirect(JNIEnv* env,
189 jobject jcaller,
190 jlong url_request_adapter) {
191 CronetURLRequestAdapter* request =
192 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
193 DCHECK(request);
194 DCHECK(!request->IsOnNetworkThread());
195 request->FollowDeferredRedirect();
196 }
197
198 static jint GetHttpStatusCode(JNIEnv* env,
199 jobject object,
200 jlong url_request_adapter) {
201 CronetURLRequestAdapter* request =
202 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
203 DCHECK(request);
204 DCHECK(request->IsOnNetworkThread());
205 return request->http_status_code();
206 }
207
208 static void GetAllHeaders(JNIEnv* env,
209 jobject object,
210 jlong url_request_adapter,
211 jobject headersMap) {
212 CronetURLRequestAdapter* request =
213 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
214 DCHECK(request);
215 DCHECK(request->IsOnNetworkThread());
216
217 net::HttpResponseHeaders* headers = request->GetResponseHeaders();
218 if (headers == NULL)
219 return;
220
221 void* iter = NULL;
222 std::string header_name;
223 std::string header_value;
224 while (headers->EnumerateHeaderLines(&iter, &header_name, &header_value)) {
225 ScopedJavaLocalRef<jstring> name =
226 ConvertUTF8ToJavaString(env, header_name);
227 ScopedJavaLocalRef<jstring> value =
228 ConvertUTF8ToJavaString(env, header_value);
229 Java_CronetUrlRequest_onAppendResponseHeader(
230 env, object, headersMap, name.Release(), value.Release());
231 }
232
233 // Some implementations (notably HttpURLConnection) include a mapping for the
234 // null key; in HTTP's case, this maps to the HTTP status line.
235 ScopedJavaLocalRef<jstring> status_line =
236 ConvertUTF8ToJavaString(env, headers->GetStatusLine());
237 Java_CronetUrlRequest_onAppendResponseHeader(
238 env, object, headersMap, NULL, status_line.Release());
239 }
240
241 static jstring GetNegotiatedProtocol(JNIEnv* env,
242 jobject object,
243 jlong url_request_adapter) {
244 CronetURLRequestAdapter* request =
245 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
246 DCHECK(request);
247 DCHECK(request->IsOnNetworkThread());
248 std::string negotiated_protocol = request->GetNegotiatedProtocol();
249 return ConvertUTF8ToJavaString(env, negotiated_protocol.c_str()).Release();
250 }
251
252 static jboolean GetWasCached(JNIEnv* env,
253 jobject jcaller,
254 jlong url_request_adapter) {
255 CronetURLRequestAdapter* request =
256 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
257 DCHECK(request);
258 DCHECK(request->IsOnNetworkThread());
259 return request->GetWasCached() ? JNI_TRUE : JNI_FALSE;
260 }
261
262 static jlong GetTotalReceivedBytes(JNIEnv* env,
263 jobject jcaller,
264 jlong url_request_adapter) {
265 CronetURLRequestAdapter* request =
266 reinterpret_cast<CronetURLRequestAdapter*>(url_request_adapter);
267 DCHECK(request);
268 DCHECK(request->IsOnNetworkThread());
269 return request->GetTotalReceivedBytes();
270 }
271
272 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698