diff options
author | mef <mef@chromium.org> | 2016-02-08 13:31:52 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-08 21:33:13 +0000 |
commit | e5cfb994bb9ab2c2bf1bd0119c5598031f71b294 (patch) | |
tree | d2af6d765654fa4d6f125b7e7148c3b555656dbe | |
parent | 9c29a2dc874636884a83cd8d8855599a868c811b (diff) | |
download | chromium_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}
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', |