summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormef <mef@chromium.org>2016-02-08 13:31:52 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-08 21:33:13 +0000
commite5cfb994bb9ab2c2bf1bd0119c5598031f71b294 (patch)
treed2af6d765654fa4d6f125b7e7148c3b555656dbe
parent9c29a2dc874636884a83cd8d8855599a868c811b (diff)
downloadchromium_src-e5cfb994bb9ab2c2bf1bd0119c5598031f71b294.zip
chromium_src-e5cfb994bb9ab2c2bf1bd0119c5598031f71b294.tar.gz
chromium_src-e5cfb994bb9ab2c2bf1bd0119c5598031f71b294.tar.bz2
[Cronet] Update CronetUrlRequest based on comments from CronetBidirectionalStream review.
- Extract IOBufferWithByteBuffer into shared module. - Remove GetXYZ accessors from prepareResponseInfoOnNetworkThread. - Use isDoneLocked() instead of isDone() to eliminate extra locking. - destroyAdapter instead of canceling the request if executor rejects the posted task. Review URL: https://codereview.chromium.org/1657733004 Cr-Commit-Position: refs/heads/master@{#374184}
-rw-r--r--components/cronet/android/BUILD.gn2
-rw-r--r--components/cronet/android/cronet_bidirectional_stream_adapter.cc43
-rw-r--r--components/cronet/android/cronet_bidirectional_stream_adapter.h3
-rw-r--r--components/cronet/android/cronet_url_request_adapter.cc106
-rw-r--r--components/cronet/android/cronet_url_request_adapter.h30
-rw-r--r--components/cronet/android/io_buffer_with_byte_buffer.cc27
-rw-r--r--components/cronet/android/io_buffer_with_byte_buffer.h51
-rw-r--r--components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java113
-rw-r--r--components/cronet/android/java/src/org/chromium/net/CronetUrlRequestContext.java4
-rw-r--r--components/cronet/cronet_static.gypi2
10 files changed, 167 insertions, 214 deletions
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index 1f9ab1e..b1a3469 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -140,6 +140,8 @@ template("cronet_static_tmpl") {
"//components/cronet/android/cronet_url_request_adapter.h",
"//components/cronet/android/cronet_url_request_context_adapter.cc",
"//components/cronet/android/cronet_url_request_context_adapter.h",
+ "//components/cronet/android/io_buffer_with_byte_buffer.cc",
+ "//components/cronet/android/io_buffer_with_byte_buffer.h",
"//components/cronet/android/url_request_adapter.cc",
"//components/cronet/android/url_request_adapter.h",
"//components/cronet/android/url_request_context_adapter.cc",
diff --git a/components/cronet/android/cronet_bidirectional_stream_adapter.cc b/components/cronet/android/cronet_bidirectional_stream_adapter.cc
index fd0dbb9..b0a07c1 100644
--- a/components/cronet/android/cronet_bidirectional_stream_adapter.cc
+++ b/components/cronet/android/cronet_bidirectional_stream_adapter.cc
@@ -12,9 +12,9 @@
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "components/cronet/android/cronet_url_request_context_adapter.h"
+#include "components/cronet/android/io_buffer_with_byte_buffer.h"
#include "components/cronet/android/url_request_error.h"
#include "jni/CronetBidirectionalStream_jni.h"
-#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/base/request_priority.h"
#include "net/http/bidirectional_stream_request_info.h"
@@ -48,47 +48,6 @@ static jlong CreateBidirectionalStream(
return reinterpret_cast<jlong>(adapter);
}
-// TODO(mef): Extract this and its original from cronet_url_request_adapter.cc
-// into separate module.
-// net::WrappedIOBuffer subclass for a buffer owned by a Java ByteBuffer. Keeps
-// the ByteBuffer alive until destroyed. Uses WrappedIOBuffer because data() is
-// owned by the embedder.
-class CronetBidirectionalStreamAdapter::IOBufferWithByteBuffer
- : public net::WrappedIOBuffer {
- public:
- // Creates a buffer wrapping the Java ByteBuffer |jbyte_buffer|.
- // |byte_buffer_data| points to the memory backed by the ByteBuffer, and
- // |position| is the index of the first byte of data inside of the buffer.
- // |limit| is the the index of the first element that should not be read or
- // written, preserved to verify that buffer is not changed externally during
- // networking operations.
- IOBufferWithByteBuffer(JNIEnv* env,
- const JavaParamRef<jobject>& jbyte_buffer,
- void* byte_buffer_data,
- int position,
- int limit)
- : net::WrappedIOBuffer(static_cast<char*>(byte_buffer_data) + position),
- byte_buffer_(env, jbyte_buffer),
- initial_position_(position),
- initial_limit_(limit) {
- DCHECK(byte_buffer_data);
- DCHECK_EQ(env->GetDirectBufferAddress(jbyte_buffer), byte_buffer_data);
- }
-
- int initial_position() const { return initial_position_; }
- int initial_limit() const { return initial_limit_; }
-
- jobject byte_buffer() const { return byte_buffer_.obj(); }
-
- private:
- ~IOBufferWithByteBuffer() override {}
-
- base::android::ScopedJavaGlobalRef<jobject> byte_buffer_;
-
- const int initial_position_;
- const int initial_limit_;
-};
-
// static
bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) {
return RegisterNativesImpl(env);
diff --git a/components/cronet/android/cronet_bidirectional_stream_adapter.h b/components/cronet/android/cronet_bidirectional_stream_adapter.h
index 14b403e..53a5380 100644
--- a/components/cronet/android/cronet_bidirectional_stream_adapter.h
+++ b/components/cronet/android/cronet_bidirectional_stream_adapter.h
@@ -25,6 +25,7 @@ class SpdyHeaderBlock;
namespace cronet {
class CronetURLRequestContextAdapter;
+class IOBufferWithByteBuffer;
// An adapter from Java BidirectionalStream object to net::BidirectionalStream.
// Created and configured from a Java thread. Start, ReadData, WriteData and
@@ -88,8 +89,6 @@ class CronetBidirectionalStreamAdapter
jboolean jsend_on_canceled);
private:
- class IOBufferWithByteBuffer;
-
// net::BidirectionalStream::Delegate implementations:
void OnHeadersSent() override;
void OnHeadersReceived(const net::SpdyHeaderBlock& response_headers) override;
diff --git a/components/cronet/android/cronet_url_request_adapter.cc b/components/cronet/android/cronet_url_request_adapter.cc
index cfdceb0..64a35c0 100644
--- a/components/cronet/android/cronet_url_request_adapter.cc
+++ b/components/cronet/android/cronet_url_request_adapter.cc
@@ -12,9 +12,9 @@
#include "base/location.h"
#include "base/logging.h"
#include "components/cronet/android/cronet_url_request_context_adapter.h"
+#include "components/cronet/android/io_buffer_with_byte_buffer.h"
#include "components/cronet/android/url_request_error.h"
#include "jni/CronetUrlRequest_jni.h"
-#include "net/base/io_buffer.h"
#include "net/base/load_flags.h"
#include "net/base/net_errors.h"
#include "net/base/request_priority.h"
@@ -57,39 +57,6 @@ static jlong CreateRequestAdapter(JNIEnv* env,
return reinterpret_cast<jlong>(adapter);
}
-// net::WrappedIOBuffer subclass for a buffer owned by a Java ByteBuffer. Keeps
-// the ByteBuffer alive until destroyed. Uses WrappedIOBuffer because data() is
-// owned by the embedder.
-class CronetURLRequestAdapter::IOBufferWithByteBuffer
- : public net::WrappedIOBuffer {
- public:
- // Creates a buffer wrapping the Java ByteBuffer |jbyte_buffer|. |data| points
- // to the memory backed by the ByteBuffer, and position is the location to
- // start writing.
- IOBufferWithByteBuffer(
- JNIEnv* env,
- jobject jbyte_buffer,
- void* data,
- int position)
- : net::WrappedIOBuffer(static_cast<char*>(data) + position),
- initial_position_(position) {
- DCHECK(data);
- DCHECK_EQ(env->GetDirectBufferAddress(jbyte_buffer), data);
- byte_buffer_.Reset(env, jbyte_buffer);
- }
-
- int initial_position() const { return initial_position_; }
-
- jobject byte_buffer() const { return byte_buffer_.obj(); }
-
- private:
- ~IOBufferWithByteBuffer() override {}
-
- base::android::ScopedJavaGlobalRef<jobject> byte_buffer_;
-
- const int initial_position_;
-};
-
CronetURLRequestAdapter::CronetURLRequestAdapter(
CronetURLRequestContextAdapter* context,
JNIEnv* env,
@@ -188,18 +155,18 @@ jboolean CronetURLRequestAdapter::ReadData(
const JavaParamRef<jobject>& jcaller,
const JavaParamRef<jobject>& jbyte_buffer,
jint jposition,
- jint jcapacity) {
+ jint jlimit) {
DCHECK(!context_->IsOnNetworkThread());
- DCHECK_LT(jposition, jcapacity);
+ DCHECK_LT(jposition, jlimit);
void* data = env->GetDirectBufferAddress(jbyte_buffer);
if (!data)
return JNI_FALSE;
scoped_refptr<IOBufferWithByteBuffer> read_buffer(
- new IOBufferWithByteBuffer(env, jbyte_buffer, data, jposition));
+ new IOBufferWithByteBuffer(env, jbyte_buffer, data, jposition, jlimit));
- int remaining_capacity = jcapacity - jposition;
+ int remaining_capacity = jlimit - jposition;
context_->PostTaskToNetworkThread(
FROM_HERE, base::Bind(&CronetURLRequestAdapter::ReadDataOnNetworkThread,
@@ -222,42 +189,6 @@ void CronetURLRequestAdapter::Destroy(JNIEnv* env,
base::Unretained(this), jsend_on_canceled));
}
-base::android::ScopedJavaLocalRef<jstring>
-CronetURLRequestAdapter::GetHttpStatusText(
- JNIEnv* env,
- const JavaParamRef<jobject>& jcaller) const {
- DCHECK(context_->IsOnNetworkThread());
- const net::HttpResponseHeaders* headers = url_request_->response_headers();
- return ConvertUTF8ToJavaString(env, headers->GetStatusText());
-}
-
-base::android::ScopedJavaLocalRef<jstring>
-CronetURLRequestAdapter::GetNegotiatedProtocol(
- JNIEnv* env,
- const JavaParamRef<jobject>& jcaller) const {
- DCHECK(context_->IsOnNetworkThread());
- return ConvertUTF8ToJavaString(
- env, url_request_->response_info().npn_negotiated_protocol);
-}
-
-base::android::ScopedJavaLocalRef<jstring>
-CronetURLRequestAdapter::GetProxyServer(
- JNIEnv* env,
- const JavaParamRef<jobject>& jcaller) const {
- DCHECK(context_->IsOnNetworkThread());
- return ConvertUTF8ToJavaString(
- env, url_request_->response_info().proxy_server.ToString());
-}
-
-jboolean CronetURLRequestAdapter::GetWasCached(
- JNIEnv* env,
- const JavaParamRef<jobject>& jcaller) const {
- DCHECK(context_->IsOnNetworkThread());
- return url_request_->response_info().was_cached;
-}
-
-// net::URLRequest::Delegate overrides (called on network thread).
-
void CronetURLRequestAdapter::OnReceivedRedirect(
net::URLRequest* request,
const net::RedirectInfo& redirect_info,
@@ -265,11 +196,20 @@ void CronetURLRequestAdapter::OnReceivedRedirect(
DCHECK(context_->IsOnNetworkThread());
DCHECK(request->status().is_success());
JNIEnv* env = base::android::AttachCurrentThread();
-
cronet::Java_CronetUrlRequest_onRedirectReceived(
env, owner_.obj(),
ConvertUTF8ToJavaString(env, redirect_info.new_url.spec()).obj(),
- redirect_info.status_code, GetResponseHeaders(env).obj(),
+ redirect_info.status_code,
+ ConvertUTF8ToJavaString(env, request->response_headers()->GetStatusText())
+ .obj(),
+ GetResponseHeaders(env).obj(),
+ request->response_info().was_cached ? JNI_TRUE : JNI_FALSE,
+ ConvertUTF8ToJavaString(env,
+ request->response_info().npn_negotiated_protocol)
+ .obj(),
+ ConvertUTF8ToJavaString(env,
+ request->response_info().proxy_server.ToString())
+ .obj(),
request->GetTotalReceivedBytes());
*defer_redirect = true;
}
@@ -303,7 +243,16 @@ void CronetURLRequestAdapter::OnResponseStarted(net::URLRequest* request) {
JNIEnv* env = base::android::AttachCurrentThread();
cronet::Java_CronetUrlRequest_onResponseStarted(
env, owner_.obj(), request->GetResponseCode(),
- GetResponseHeaders(env).obj());
+ ConvertUTF8ToJavaString(env, request->response_headers()->GetStatusText())
+ .obj(),
+ GetResponseHeaders(env).obj(),
+ request->response_info().was_cached ? JNI_TRUE : JNI_FALSE,
+ ConvertUTF8ToJavaString(env,
+ request->response_info().npn_negotiated_protocol)
+ .obj(),
+ ConvertUTF8ToJavaString(env,
+ request->response_info().proxy_server.ToString())
+ .obj());
}
void CronetURLRequestAdapter::OnReadCompleted(net::URLRequest* request,
@@ -315,7 +264,8 @@ void CronetURLRequestAdapter::OnReadCompleted(net::URLRequest* request,
JNIEnv* env = base::android::AttachCurrentThread();
cronet::Java_CronetUrlRequest_onReadCompleted(
env, owner_.obj(), read_buffer_->byte_buffer(), bytes_read,
- read_buffer_->initial_position(), request->GetTotalReceivedBytes());
+ read_buffer_->initial_position(), read_buffer_->initial_limit(),
+ request->GetTotalReceivedBytes());
// Free the read buffer. This lets the Java ByteBuffer be freed, if the
// embedder releases it, too.
read_buffer_ = nullptr;
diff --git a/components/cronet/android/cronet_url_request_adapter.h b/components/cronet/android/cronet_url_request_adapter.h
index f85eb81..2041ce9 100644
--- a/components/cronet/android/cronet_url_request_adapter.h
+++ b/components/cronet/android/cronet_url_request_adapter.h
@@ -36,6 +36,7 @@ class UploadDataStream;
namespace cronet {
class CronetURLRequestContextAdapter;
+class IOBufferWithByteBuffer;
bool CronetUrlRequestAdapterRegisterJni(JNIEnv* env);
@@ -44,8 +45,7 @@ bool CronetUrlRequestAdapterRegisterJni(JNIEnv* env);
// posted to network thread and all callbacks into the Java CronetUrlRequest are
// done on the network thread. Java CronetUrlRequest is expected to initiate the
// next step like FollowDeferredRedirect, ReadData or Destroy. Public methods
-// can be called on any thread except PopulateResponseHeaders and Get* methods,
-// which can only be called on the network thread.
+// can be called on any thread.
class CronetURLRequestAdapter : public net::URLRequest::Delegate {
public:
CronetURLRequestAdapter(CronetURLRequestContextAdapter* context,
@@ -103,30 +103,6 @@ class CronetURLRequestAdapter : public net::URLRequest::Delegate {
const base::android::JavaParamRef<jobject>& jcaller,
jboolean jsend_on_canceled);
- // When called during a OnRedirect or OnResponseStarted callback, these
- // methods return the corresponding response information. These methods
- // can only be called on the network thread.
-
- // Gets http status text from the response headers.
- base::android::ScopedJavaLocalRef<jstring> GetHttpStatusText(
- JNIEnv* env,
- const base::android::JavaParamRef<jobject>& jcaller) const;
-
- // Gets NPN or ALPN Negotiated Protocol (if any) from HttpResponseInfo.
- base::android::ScopedJavaLocalRef<jstring> GetNegotiatedProtocol(
- JNIEnv* env,
- const base::android::JavaParamRef<jobject>& jcaller) const;
-
- // Returns the host and port of the proxy server, if one was used.
- base::android::ScopedJavaLocalRef<jstring> GetProxyServer(
- JNIEnv* env,
- const base::android::JavaParamRef<jobject>& jcaller) const;
-
- // Returns true if response is coming from the cache.
- jboolean GetWasCached(
- JNIEnv* env,
- const base::android::JavaParamRef<jobject>& jcaller) const;
-
// net::URLRequest::Delegate implementations:
void OnReceivedRedirect(net::URLRequest* request,
@@ -142,8 +118,6 @@ class CronetURLRequestAdapter : public net::URLRequest::Delegate {
void OnReadCompleted(net::URLRequest* request, int bytes_read) override;
private:
- class IOBufferWithByteBuffer;
-
void StartOnNetworkThread();
void GetStatusOnNetworkThread(
const base::android::ScopedJavaGlobalRef<jobject>& jstatus_listener_ref)
diff --git a/components/cronet/android/io_buffer_with_byte_buffer.cc b/components/cronet/android/io_buffer_with_byte_buffer.cc
new file mode 100644
index 0000000..e6be670
--- /dev/null
+++ b/components/cronet/android/io_buffer_with_byte_buffer.cc
@@ -0,0 +1,27 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/cronet/android/io_buffer_with_byte_buffer.h"
+
+#include "base/logging.h"
+
+namespace cronet {
+
+IOBufferWithByteBuffer::IOBufferWithByteBuffer(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& jbyte_buffer,
+ void* byte_buffer_data,
+ jint position,
+ jint limit)
+ : net::WrappedIOBuffer(static_cast<char*>(byte_buffer_data) + position),
+ byte_buffer_(env, jbyte_buffer),
+ initial_position_(position),
+ initial_limit_(limit) {
+ DCHECK(byte_buffer_data);
+ DCHECK_EQ(env->GetDirectBufferAddress(jbyte_buffer), byte_buffer_data);
+}
+
+IOBufferWithByteBuffer::~IOBufferWithByteBuffer() {}
+
+} // namespace cronet
diff --git a/components/cronet/android/io_buffer_with_byte_buffer.h b/components/cronet/android/io_buffer_with_byte_buffer.h
new file mode 100644
index 0000000..17cce93
--- /dev/null
+++ b/components/cronet/android/io_buffer_with_byte_buffer.h
@@ -0,0 +1,51 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CRONET_ANDROID_IO_BUFFER_WITH_BYTE_BUFFER_H_
+#define COMPONENTS_CRONET_ANDROID_IO_BUFFER_WITH_BYTE_BUFFER_H_
+
+#include <jni.h>
+
+#include "base/android/scoped_java_ref.h"
+#include "net/base/io_buffer.h"
+
+namespace cronet {
+
+// net::WrappedIOBuffer subclass for a buffer owned by a Java ByteBuffer. Keeps
+// the ByteBuffer alive until destroyed. Uses WrappedIOBuffer because data() is
+// owned by the embedder.
+class IOBufferWithByteBuffer : public net::WrappedIOBuffer {
+ public:
+ // Creates a buffer wrapping the Java ByteBuffer |jbyte_buffer|.
+ // |byte_buffer_data| points to the memory backed by the ByteBuffer, and
+ // |position| is the index of the first byte of data inside of the buffer.
+ // |limit| is the the index of the first element that should not be read or
+ // written, preserved to verify that buffer is not changed externally during
+ // networking operations.
+ IOBufferWithByteBuffer(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& jbyte_buffer,
+ void* byte_buffer_data,
+ jint position,
+ jint limit);
+
+ jint initial_position() const { return initial_position_; }
+ jint initial_limit() const { return initial_limit_; }
+
+ jobject byte_buffer() const { return byte_buffer_.obj(); }
+
+ private:
+ ~IOBufferWithByteBuffer() override;
+
+ base::android::ScopedJavaGlobalRef<jobject> byte_buffer_;
+
+ const jint initial_position_;
+ const jint initial_limit_;
+
+ DISALLOW_COPY_AND_ASSIGN(IOBufferWithByteBuffer);
+};
+
+} // namespace cronet
+
+#endif // COMPONENTS_CRONET_ANDROID_IO_BUFFER_WITH_BYTE_BUFFER_H_
diff --git a/components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java b/components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java
index c8ac7a6..d332644 100644
--- a/components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java
+++ b/components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java
@@ -94,35 +94,32 @@ final class CronetUrlRequest implements UrlRequest {
private static final class HeadersList extends ArrayList<Map.Entry<String, String>> {}
private final class OnReadCompletedRunnable implements Runnable {
+ // Buffer passed back from current invocation of onReadCompleted.
ByteBuffer mByteBuffer;
@Override
public void run() {
- if (isDone()) {
- return;
- }
+ // Null out mByteBuffer, to pass buffer ownership to callback or release if done.
+ ByteBuffer buffer = mByteBuffer;
+ mByteBuffer = null;
+
try {
synchronized (mUrlRequestAdapterLock) {
- if (mUrlRequestAdapter == 0) {
+ if (isDoneLocked()) {
return;
}
mWaitingOnRead = true;
}
- // Null out mByteBuffer, out of paranoia. Has to be done before
- // mCallback call, to avoid any race when there are multiple
- // executor threads.
- ByteBuffer buffer = mByteBuffer;
- mByteBuffer = null;
mCallback.onReadCompleted(CronetUrlRequest.this, mResponseInfo, buffer);
} catch (Exception e) {
- onListenerException(e);
+ onCallbackException(e);
}
}
}
- CronetUrlRequest(CronetUrlRequestContext requestContext, long urlRequestContextAdapter,
- String url, int priority, UrlRequest.Callback callback, Executor executor,
- Collection<Object> requestAnnotations, boolean metricsCollectionEnabled) {
+ CronetUrlRequest(CronetUrlRequestContext requestContext, String url, int priority,
+ UrlRequest.Callback callback, Executor executor, Collection<Object> requestAnnotations,
+ boolean metricsCollectionEnabled) {
if (url == null) {
throw new NullPointerException("URL is required");
}
@@ -238,7 +235,7 @@ final class CronetUrlRequest implements UrlRequest {
}
mWaitingOnRedirect = false;
- if (isDone()) {
+ if (isDoneLocked()) {
return;
}
@@ -256,7 +253,7 @@ final class CronetUrlRequest implements UrlRequest {
}
mWaitingOnRead = false;
- if (isDone()) {
+ if (isDoneLocked()) {
return;
}
@@ -272,7 +269,7 @@ final class CronetUrlRequest implements UrlRequest {
@Override
public void cancel() {
synchronized (mUrlRequestAdapterLock) {
- if (isDone() || !mStarted) {
+ if (isDoneLocked() || !mStarted) {
return;
}
destroyRequestAdapter(true);
@@ -282,10 +279,15 @@ final class CronetUrlRequest implements UrlRequest {
@Override
public boolean isDone() {
synchronized (mUrlRequestAdapterLock) {
- return mStarted && mUrlRequestAdapter == 0;
+ return isDoneLocked();
}
}
+ @GuardedBy("mUrlRequestAdapterLock")
+ private boolean isDoneLocked() {
+ return mStarted && mUrlRequestAdapter == 0;
+ }
+
@Override
public void disableCache() {
checkNotStarted();
@@ -330,8 +332,8 @@ final class CronetUrlRequest implements UrlRequest {
Log.e(CronetUrlRequestContext.LOG_TAG,
"Exception posting task to executor", failException);
// If posting a task throws an exception, then there is no choice
- // but to cancel the request.
- cancel();
+ // but to destroy the request without invoking the callback.
+ destroyRequestAdapter(false);
}
}
@@ -352,18 +354,13 @@ final class CronetUrlRequest implements UrlRequest {
}
}
- private UrlResponseInfo prepareResponseInfoOnNetworkThread(
- int httpStatusCode, String[] headers) {
- long urlRequestAdapter;
+ private UrlResponseInfo prepareResponseInfoOnNetworkThread(int httpStatusCode,
+ String httpStatusText, String[] headers, boolean wasCached, String negotiatedProtocol,
+ String proxyServer) {
synchronized (mUrlRequestAdapterLock) {
if (mUrlRequestAdapter == 0) {
return null;
}
- // This method is running on network thread, so even if
- // mUrlRequestAdapter is set to 0 from another thread the actual
- // deletion of the adapter is posted to network thread, so it is
- // safe to preserve and use urlRequestAdapter outside the lock.
- urlRequestAdapter = mUrlRequestAdapter;
}
HeadersList headersList = new HeadersList();
@@ -372,17 +369,15 @@ final class CronetUrlRequest implements UrlRequest {
headers[i], headers[i + 1]));
}
- UrlResponseInfo responseInfo = new UrlResponseInfo(new ArrayList<String>(mUrlChain),
- httpStatusCode, nativeGetHttpStatusText(urlRequestAdapter), headersList,
- nativeGetWasCached(urlRequestAdapter),
- nativeGetNegotiatedProtocol(urlRequestAdapter),
- nativeGetProxyServer(urlRequestAdapter));
+ UrlResponseInfo responseInfo =
+ new UrlResponseInfo(new ArrayList<String>(mUrlChain), httpStatusCode,
+ httpStatusText, headersList, wasCached, negotiatedProtocol, proxyServer);
return responseInfo;
}
private void checkNotStarted() {
synchronized (mUrlRequestAdapterLock) {
- if (mStarted || isDone()) {
+ if (mStarted || isDoneLocked()) {
throw new IllegalStateException("Request is already started.");
}
}
@@ -407,18 +402,18 @@ final class CronetUrlRequest implements UrlRequest {
}
/**
- * If listener method throws an exception, request gets canceled
+ * If callback method throws an exception, request gets canceled
* and exception is reported via onFailed listener callback.
* Only called on the Executor.
*/
- private void onListenerException(Exception e) {
+ private void onCallbackException(Exception e) {
UrlRequestException requestError =
new UrlRequestException("Exception received from UrlRequest.Callback", e);
Log.e(CronetUrlRequestContext.LOG_TAG,
"Exception in CalledByNative method", e);
// Do not call into listener if request is finished.
synchronized (mUrlRequestAdapterLock) {
- if (isDone()) {
+ if (isDoneLocked()) {
return;
}
destroyRequestAdapter(false);
@@ -449,7 +444,7 @@ final class CronetUrlRequest implements UrlRequest {
@Override
public void run() {
synchronized (mUrlRequestAdapterLock) {
- if (isDone()) {
+ if (isDoneLocked()) {
return;
}
destroyRequestAdapter(false);
@@ -484,10 +479,11 @@ final class CronetUrlRequest implements UrlRequest {
*/
@SuppressWarnings("unused")
@CalledByNative
- private void onRedirectReceived(final String newLocation, int httpStatusCode, String[] headers,
- long receivedBytesCount) {
- final UrlResponseInfo responseInfo =
- prepareResponseInfoOnNetworkThread(httpStatusCode, headers);
+ private void onRedirectReceived(final String newLocation, int httpStatusCode,
+ String httpStatusText, String[] headers, boolean wasCached, String negotiatedProtocol,
+ String proxyServer, long receivedBytesCount) {
+ final UrlResponseInfo responseInfo = prepareResponseInfoOnNetworkThread(httpStatusCode,
+ httpStatusText, headers, wasCached, negotiatedProtocol, proxyServer);
mReceivedBytesCountFromRedirects += receivedBytesCount;
responseInfo.setReceivedBytesCount(mReceivedBytesCountFromRedirects);
@@ -498,7 +494,7 @@ final class CronetUrlRequest implements UrlRequest {
@Override
public void run() {
synchronized (mUrlRequestAdapterLock) {
- if (isDone()) {
+ if (isDoneLocked()) {
return;
}
mWaitingOnRedirect = true;
@@ -507,7 +503,7 @@ final class CronetUrlRequest implements UrlRequest {
try {
mCallback.onRedirectReceived(CronetUrlRequest.this, responseInfo, newLocation);
} catch (Exception e) {
- onListenerException(e);
+ onCallbackException(e);
}
}
};
@@ -520,16 +516,18 @@ final class CronetUrlRequest implements UrlRequest {
*/
@SuppressWarnings("unused")
@CalledByNative
- private void onResponseStarted(int httpStatusCode, String[] headers) {
+ private void onResponseStarted(int httpStatusCode, String httpStatusText, String[] headers,
+ boolean wasCached, String negotiatedProtocol, String proxyServer) {
if (mRequestMetricsAccumulator != null) {
mRequestMetricsAccumulator.onResponseStarted();
}
- mResponseInfo = prepareResponseInfoOnNetworkThread(httpStatusCode, headers);
+ mResponseInfo = prepareResponseInfoOnNetworkThread(httpStatusCode, httpStatusText, headers,
+ wasCached, negotiatedProtocol, proxyServer);
Runnable task = new Runnable() {
@Override
public void run() {
synchronized (mUrlRequestAdapterLock) {
- if (isDone()) {
+ if (isDoneLocked()) {
return;
}
mWaitingOnRead = true;
@@ -538,7 +536,7 @@ final class CronetUrlRequest implements UrlRequest {
try {
mCallback.onResponseStarted(CronetUrlRequest.this, mResponseInfo);
} catch (Exception e) {
- onListenerException(e);
+ onCallbackException(e);
}
}
};
@@ -558,14 +556,17 @@ final class CronetUrlRequest implements UrlRequest {
* @param initialPosition Original position of byteBuffer when passed to
* read(). Used as a minimal check that the buffer hasn't been
* modified while reading from the network.
+ * @param initialLimit Original limit of byteBuffer when passed to
+ * read(). Used as a minimal check that the buffer hasn't been
+ * modified while reading from the network.
* @param receivedBytesCount number of bytes received.
*/
@SuppressWarnings("unused")
@CalledByNative
private void onReadCompleted(final ByteBuffer byteBuffer, int bytesRead, int initialPosition,
- long receivedBytesCount) {
+ int initialLimit, long receivedBytesCount) {
mResponseInfo.setReceivedBytesCount(mReceivedBytesCountFromRedirects + receivedBytesCount);
- if (byteBuffer.position() != initialPosition) {
+ if (byteBuffer.position() != initialPosition || byteBuffer.limit() != initialLimit) {
failWithException(new UrlRequestException(
"ByteBuffer modified externally during read", null));
return;
@@ -592,7 +593,7 @@ final class CronetUrlRequest implements UrlRequest {
@Override
public void run() {
synchronized (mUrlRequestAdapterLock) {
- if (isDone()) {
+ if (isDoneLocked()) {
return;
}
// Destroy adapter first, so request context could be shut
@@ -733,17 +734,5 @@ final class CronetUrlRequest implements UrlRequest {
private native void nativeDestroy(long nativePtr, boolean sendOnCanceled);
@NativeClassQualifiedName("CronetURLRequestAdapter")
- private native String nativeGetHttpStatusText(long nativePtr);
-
- @NativeClassQualifiedName("CronetURLRequestAdapter")
- private native String nativeGetNegotiatedProtocol(long nativePtr);
-
- @NativeClassQualifiedName("CronetURLRequestAdapter")
- private native String nativeGetProxyServer(long nativePtr);
-
- @NativeClassQualifiedName("CronetURLRequestAdapter")
private native void nativeGetStatus(long nativePtr, UrlRequest.StatusListener listener);
-
- @NativeClassQualifiedName("CronetURLRequestAdapter")
- private native boolean nativeGetWasCached(long nativePtr);
}
diff --git a/components/cronet/android/java/src/org/chromium/net/CronetUrlRequestContext.java b/components/cronet/android/java/src/org/chromium/net/CronetUrlRequestContext.java
index cf6dd24..4d935b7 100644
--- a/components/cronet/android/java/src/org/chromium/net/CronetUrlRequestContext.java
+++ b/components/cronet/android/java/src/org/chromium/net/CronetUrlRequestContext.java
@@ -134,8 +134,8 @@ class CronetUrlRequestContext extends CronetEngine {
metricsCollectionEnabled = !mFinishedListenerList.isEmpty();
}
}
- return new CronetUrlRequest(this, mUrlRequestContextAdapter, url, priority, callback,
- executor, requestAnnotations, metricsCollectionEnabled);
+ return new CronetUrlRequest(this, url, priority, callback, executor, requestAnnotations,
+ metricsCollectionEnabled);
}
}
diff --git a/components/cronet/cronet_static.gypi b/components/cronet/cronet_static.gypi
index aff6ce4..6521926 100644
--- a/components/cronet/cronet_static.gypi
+++ b/components/cronet/cronet_static.gypi
@@ -32,6 +32,8 @@
'android/cronet_url_request_adapter.h',
'android/cronet_url_request_context_adapter.cc',
'android/cronet_url_request_context_adapter.h',
+ 'android/io_buffer_with_byte_buffer.cc',
+ 'android/io_buffer_with_byte_buffer.h',
'android/url_request_adapter.cc',
'android/url_request_adapter.h',
'android/url_request_context_adapter.cc',