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

Unified 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: Move userAgent into config, introduce ExtendedResponseInfo. Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: components/cronet/android/cronet_url_request.cc
diff --git a/components/cronet/android/chromium_url_request.cc b/components/cronet/android/cronet_url_request.cc
similarity index 54%
copy from components/cronet/android/chromium_url_request.cc
copy to components/cronet/android/cronet_url_request.cc
index b2291b38799b4dd4759b412e1f93a494514c9c07..13db34fc40fa926088d626cfddfb3eff7923bb0e 100644
--- a/components/cronet/android/chromium_url_request.cc
+++ b/components/cronet/android/cronet_url_request.cc
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "components/cronet/android/chromium_url_request.h"
+#include "components/cronet/android/cronet_url_request.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/macros.h"
-#include "components/cronet/android/url_request_adapter.h"
-#include "components/cronet/android/url_request_context_adapter.h"
-#include "jni/ChromiumUrlRequest_jni.h"
+#include "components/cronet/android/cronet_url_request_adapter.h"
+#include "components/cronet/android/cronet_url_request_context_adapter.h"
+#include "jni/CronetUrlRequest_jni.h"
#include "net/base/net_errors.h"
#include "net/base/request_priority.h"
#include "net/http/http_response_headers.h"
@@ -21,77 +21,65 @@ namespace {
net::RequestPriority ConvertRequestPriority(jint request_priority) {
switch (request_priority) {
- case REQUEST_PRIORITY_IDLE:
+ case CRONET_REQUEST_PRIORITY_IDLE:
return net::IDLE;
- case REQUEST_PRIORITY_LOWEST:
+ case CRONET_REQUEST_PRIORITY_LOWEST:
return net::LOWEST;
- case REQUEST_PRIORITY_LOW:
+ case CRONET_REQUEST_PRIORITY_LOW:
return net::LOW;
- case REQUEST_PRIORITY_MEDIUM:
+ case CRONET_REQUEST_PRIORITY_MEDIUM:
return net::MEDIUM;
- case REQUEST_PRIORITY_HIGHEST:
+ case CRONET_REQUEST_PRIORITY_HIGHEST:
return net::HIGHEST;
default:
return net::LOWEST;
}
}
-
-void SetPostContentType(JNIEnv* env,
- URLRequestAdapter* request,
- jstring content_type) {
- DCHECK(request != NULL);
-
- std::string method_post("POST");
- request->SetMethod(method_post);
-
- std::string content_type_header("Content-Type");
- std::string content_type_string(
- base::android::ConvertJavaStringToUTF8(env, content_type));
-
- request->AddHeader(content_type_header, content_type_string);
-}
-
-// A delegate of URLRequestAdapter that delivers callbacks to the Java layer.
-class JniURLRequestAdapterDelegate
- : public URLRequestAdapter::URLRequestAdapterDelegate {
+// A delegate of CronetURLRequestAdapter that delivers callbacks to the Java
+// layer.
+class JniCronetURLRequestAdapterDelegate
+ : public CronetURLRequestAdapter::CronetURLRequestAdapterDelegate {
public:
- JniURLRequestAdapterDelegate(JNIEnv* env, jobject owner) {
+ JniCronetURLRequestAdapterDelegate(JNIEnv* env, jobject owner) {
owner_ = env->NewGlobalRef(owner);
}
- virtual void OnResponseStarted(URLRequestAdapter* request) OVERRIDE {
+ virtual void OnRedirect(CronetURLRequestAdapter* request,
+ const GURL& newLocation) OVERRIDE {
JNIEnv* env = base::android::AttachCurrentThread();
- cronet::Java_ChromiumUrlRequest_onResponseStarted(env, owner_);
+ cronet::Java_CronetUrlRequest_onRedirect(
+ env,
+ owner_,
+ ConvertUTF8ToJavaString(env, newLocation.spec()).Release());
}
- virtual void OnBytesRead(URLRequestAdapter* request) OVERRIDE {
- int bytes_read = request->bytes_read();
- if (bytes_read != 0) {
- JNIEnv* env = base::android::AttachCurrentThread();
+ virtual void OnResponseStarted(CronetURLRequestAdapter* request) OVERRIDE {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ cronet::Java_CronetUrlRequest_onResponseStarted(env, owner_);
mmenke 2014/10/02 15:24:09 Should check if request->status().is_success() is
mef 2014/10/02 22:07:42 Per discussion moved status checks to cronet_url_r
+ }
+
+ virtual void OnBytesRead(CronetURLRequestAdapter* request,
+ int bytes_read) OVERRIDE {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ if (bytes_read >= 0) {
mmenke 2014/10/02 15:24:09 "&& request_->status().is_success()"
mef 2014/10/02 22:07:42 Done.
base::android::ScopedJavaLocalRef<jobject> java_buffer(
env, env->NewDirectByteBuffer(request->Data(), bytes_read));
- cronet::Java_ChromiumUrlRequest_onBytesRead(
+ cronet::Java_CronetUrlRequest_onDataReceived(
env, owner_, java_buffer.obj());
+ } else {
+ cronet::Java_CronetUrlRequest_onError(env, owner_, request->error_code());
}
}
- virtual void OnRequestFinished(URLRequestAdapter* request) OVERRIDE {
- JNIEnv* env = base::android::AttachCurrentThread();
- cronet::Java_ChromiumUrlRequest_finish(env, owner_);
- }
-
- virtual int ReadFromUploadChannel(net::IOBuffer* buf,
- int buf_length) OVERRIDE {
+ virtual void OnRequestFinished(CronetURLRequestAdapter* request,
+ bool canceled) OVERRIDE {
JNIEnv* env = base::android::AttachCurrentThread();
- base::android::ScopedJavaLocalRef<jobject> java_buffer(
- env, env->NewDirectByteBuffer(buf->data(), buf_length));
- jint bytes_read = cronet::Java_ChromiumUrlRequest_readFromUploadChannel(
- env, owner_, java_buffer.obj());
- return bytes_read;
+ cronet::Java_CronetUrlRequest_onComplete(env, owner_,
+ canceled ? JNI_TRUE : JNI_FALSE );
}
protected:
- virtual ~JniURLRequestAdapterDelegate() {
+ virtual ~JniCronetURLRequestAdapterDelegate() {
JNIEnv* env = base::android::AttachCurrentThread();
env->DeleteGlobalRef(owner_);
}
@@ -99,13 +87,13 @@ class JniURLRequestAdapterDelegate
private:
jobject owner_;
- DISALLOW_COPY_AND_ASSIGN(JniURLRequestAdapterDelegate);
+ DISALLOW_COPY_AND_ASSIGN(JniCronetURLRequestAdapterDelegate);
};
} // namespace
// Explicitly register static JNI functions.
-bool ChromiumUrlRequestRegisterJni(JNIEnv* env) {
+bool CronetUrlRequestRegisterJni(JNIEnv* env) {
return RegisterNativesImpl(env);
}
@@ -114,19 +102,20 @@ static jlong CreateRequestAdapter(JNIEnv* env,
jlong urlRequestContextAdapter,
mmenke 2014/10/02 15:24:09 We should probably be using C++ style guide style
mef 2014/10/02 22:07:42 Done.
jstring url_string,
jint priority) {
- URLRequestContextAdapter* context =
- reinterpret_cast<URLRequestContextAdapter*>(urlRequestContextAdapter);
+ CronetURLRequestContextAdapter* context =
+ reinterpret_cast<CronetURLRequestContextAdapter*>(
+ urlRequestContextAdapter);
DCHECK(context != NULL);
GURL url(base::android::ConvertJavaStringToUTF8(env, url_string));
VLOG(1) << "New chromium network request: " << url.possibly_invalid_spec();
- URLRequestAdapter* adapter =
- new URLRequestAdapter(context,
- new JniURLRequestAdapterDelegate(env, object),
- url,
- ConvertRequestPriority(priority));
+ CronetURLRequestAdapter* adapter = new CronetURLRequestAdapter(
+ context,
+ new JniCronetURLRequestAdapterDelegate(env, object),
+ url,
+ ConvertRequestPriority(priority));
return reinterpret_cast<jlong>(adapter);
}
@@ -137,8 +126,8 @@ static void AddHeader(JNIEnv* env,
jlong urlRequestAdapter,
jstring name,
jstring value) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
DCHECK(request);
std::string name_string(base::android::ConvertJavaStringToUTF8(env, name));
@@ -147,12 +136,12 @@ static void AddHeader(JNIEnv* env,
request->AddHeader(name_string, value_string);
}
-static void SetMethod(JNIEnv* env,
- jobject object,
- jlong urlRequestAdapter,
- jstring method) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+static void SetHttpMethod(JNIEnv* env,
+ jobject object,
+ jlong urlRequestAdapter,
+ jstring method) {
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
DCHECK(request);
std::string method_string(
@@ -161,68 +150,10 @@ static void SetMethod(JNIEnv* env,
request->SetMethod(method_string);
}
-static void SetUploadData(JNIEnv* env,
- jobject object,
- jlong urlRequestAdapter,
- jstring content_type,
- jbyteArray content) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
- SetPostContentType(env, request, content_type);
-
- if (content != NULL) {
- jsize size = env->GetArrayLength(content);
- if (size > 0) {
- jbyte* content_bytes = env->GetByteArrayElements(content, NULL);
- request->SetUploadContent(reinterpret_cast<const char*>(content_bytes),
- size);
- env->ReleaseByteArrayElements(content, content_bytes, 0);
- }
- }
-}
-
-static void SetUploadChannel(JNIEnv* env,
- jobject object,
- jlong urlRequestAdapter,
- jstring content_type,
- jlong content_length) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
- SetPostContentType(env, request, content_type);
-
- request->SetUploadChannel(env, content_length);
-}
-
-static void EnableChunkedUpload(JNIEnv* env,
- jobject object,
- jlong urlRequestAdapter,
- jstring content_type) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
- SetPostContentType(env, request, content_type);
-
- request->EnableChunkedUpload();
-}
-
-static void AppendChunk(JNIEnv* env,
- jobject object,
- jlong urlRequestAdapter,
- jobject chunk_byte_buffer,
- jint chunk_size,
- jboolean is_last_chunk) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
- DCHECK(chunk_byte_buffer != NULL);
-
- void* chunk = env->GetDirectBufferAddress(chunk_byte_buffer);
- request->AppendChunk(
- reinterpret_cast<const char*>(chunk), chunk_size, is_last_chunk);
-}
-
/* synchronized */
mmenke 2014/10/02 15:24:09 None of these are synchronized, are they?
mef 2014/10/02 22:07:42 Done.
static void Start(JNIEnv* env, jobject object, jlong urlRequestAdapter) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
if (request != NULL) {
request->Start();
}
@@ -232,8 +163,8 @@ static void Start(JNIEnv* env, jobject object, jlong urlRequestAdapter) {
static void DestroyRequestAdapter(JNIEnv* env,
jobject object,
jlong urlRequestAdapter) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
if (request != NULL) {
request->Destroy();
}
@@ -241,22 +172,40 @@ static void DestroyRequestAdapter(JNIEnv* env,
/* synchronized */
static void Cancel(JNIEnv* env, jobject object, jlong urlRequestAdapter) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
if (request != NULL) {
request->Cancel();
}
}
+static void ReceiveData(JNIEnv* env, jobject jcaller, jlong urlRequestAdapter) {
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
+ if (request != NULL) {
+ request->ReadData();
+ }
mmenke 2014/10/02 15:24:08 nit: --braces. (Goes for all the one-line if sta
mef 2014/10/02 22:07:42 Done.
+}
+
+static void FollowDeferredRedirect(JNIEnv* env,
+ jobject jcaller,
+ jlong urlRequestAdapter) {
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
+ if (request != NULL) {
+ request->FollowDeferredRedirect();
+ }
+}
+
static jint GetErrorCode(JNIEnv* env, jobject object, jlong urlRequestAdapter) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
int error_code = request->error_code();
switch (error_code) {
// TODO(mef): Investigate returning success on positive values, too, as
// they technically indicate success.
case net::OK:
- return REQUEST_ERROR_SUCCESS;
+ return CRONET_REQUEST_ERROR_SUCCESS;
// TODO(mef): Investigate this. The fact is that Chrome does not do this,
// and this library is not just being used for downloads.
@@ -268,27 +217,27 @@ static jint GetErrorCode(JNIEnv* env, jobject object, jlong urlRequestAdapter) {
// treat downloads as complete in both cases, so we follow their lead.
case net::ERR_CONTENT_LENGTH_MISMATCH:
case net::ERR_INCOMPLETE_CHUNKED_ENCODING:
- return REQUEST_ERROR_SUCCESS;
+ return CRONET_REQUEST_ERROR_SUCCESS;
case net::ERR_INVALID_URL:
case net::ERR_DISALLOWED_URL_SCHEME:
case net::ERR_UNKNOWN_URL_SCHEME:
- return REQUEST_ERROR_MALFORMED_URL;
+ return CRONET_REQUEST_ERROR_MALFORMED_URL;
case net::ERR_CONNECTION_TIMED_OUT:
- return REQUEST_ERROR_CONNECTION_TIMED_OUT;
+ return CRONET_REQUEST_ERROR_CONNECTION_TIMED_OUT;
case net::ERR_NAME_NOT_RESOLVED:
- return REQUEST_ERROR_UNKNOWN_HOST;
+ return CRONET_REQUEST_ERROR_UNKNOWN_HOST;
}
- return REQUEST_ERROR_UNKNOWN;
+ return CRONET_REQUEST_ERROR_UNKNOWN;
}
static jstring GetErrorString(JNIEnv* env,
jobject object,
jlong urlRequestAdapter) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
int error_code = request->error_code();
char buffer[200];
std::string error_string = net::ErrorToString(error_code);
@@ -303,16 +252,16 @@ static jstring GetErrorString(JNIEnv* env,
static jint GetHttpStatusCode(JNIEnv* env,
jobject object,
jlong urlRequestAdapter) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
return request->http_status_code();
}
static jstring GetContentType(JNIEnv* env,
jobject object,
jlong urlRequestAdapter) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
if (request == NULL) {
return NULL;
}
@@ -327,8 +276,8 @@ static jstring GetContentType(JNIEnv* env,
static jlong GetContentLength(JNIEnv* env,
jobject object,
jlong urlRequestAdapter) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
if (request == NULL) {
return 0;
}
@@ -339,8 +288,8 @@ static jstring GetHeader(JNIEnv* env,
jobject object,
jlong urlRequestAdapter,
jstring name) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
if (request == NULL) {
return NULL;
}
@@ -358,8 +307,8 @@ static void GetAllHeaders(JNIEnv* env,
jobject object,
jlong urlRequestAdapter,
jobject headersMap) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
if (request == NULL)
return;
@@ -375,7 +324,7 @@ static void GetAllHeaders(JNIEnv* env,
ConvertUTF8ToJavaString(env, header_name);
ScopedJavaLocalRef<jstring> value =
ConvertUTF8ToJavaString(env, header_value);
- Java_ChromiumUrlRequest_onAppendResponseHeader(
+ Java_CronetUrlRequest_onAppendResponseHeader(
env, object, headersMap, name.Release(), value.Release());
}
@@ -383,15 +332,15 @@ static void GetAllHeaders(JNIEnv* env,
// null key; in HTTP's case, this maps to the HTTP status line.
ScopedJavaLocalRef<jstring> status_line =
ConvertUTF8ToJavaString(env, headers->GetStatusLine());
- Java_ChromiumUrlRequest_onAppendResponseHeader(
+ Java_CronetUrlRequest_onAppendResponseHeader(
env, object, headersMap, NULL, status_line.Release());
}
static jstring GetNegotiatedProtocol(JNIEnv* env,
jobject object,
jlong urlRequestAdapter) {
- URLRequestAdapter* request =
- reinterpret_cast<URLRequestAdapter*>(urlRequestAdapter);
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
if (request == NULL)
return ConvertUTF8ToJavaString(env, "").Release();
@@ -399,4 +348,26 @@ static jstring GetNegotiatedProtocol(JNIEnv* env,
return ConvertUTF8ToJavaString(env, negotiated_protocol.c_str()).Release();
}
+static jboolean GetWasCached(JNIEnv* env,
+ jobject jcaller,
+ jlong urlRequestAdapter) {
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
+ if (request == NULL)
+ return JNI_FALSE;
+
+ return request->GetWasCached() ? JNI_TRUE : JNI_FALSE;
+}
+
+static jlong GetTotalReceivedBytes(JNIEnv* env,
+ jobject jcaller,
+ jlong urlRequestAdapter) {
+ CronetURLRequestAdapter* request =
+ reinterpret_cast<CronetURLRequestAdapter*>(urlRequestAdapter);
+ if (request == NULL) {
+ return 0;
+ }
+ return request->GetTotalReceivedBytes();
+}
+
} // namespace cronet

Powered by Google App Engine
This is Rietveld 408576698