| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.net.impl; | 5 package org.chromium.net.impl; |
| 6 | 6 |
| 7 import android.util.Log; | 7 import org.chromium.base.Log; |
| 8 | |
| 9 import org.chromium.base.VisibleForTesting; | 8 import org.chromium.base.VisibleForTesting; |
| 10 import org.chromium.base.annotations.CalledByNative; | 9 import org.chromium.base.annotations.CalledByNative; |
| 11 import org.chromium.base.annotations.JNIAdditionalImport; | 10 import org.chromium.base.annotations.JNIAdditionalImport; |
| 12 import org.chromium.base.annotations.JNINamespace; | 11 import org.chromium.base.annotations.JNINamespace; |
| 13 import org.chromium.base.annotations.NativeClassQualifiedName; | 12 import org.chromium.base.annotations.NativeClassQualifiedName; |
| 14 import org.chromium.net.InlineExecutionProhibitedException; | 13 import org.chromium.net.InlineExecutionProhibitedException; |
| 15 import org.chromium.net.Preconditions; | |
| 16 import org.chromium.net.QuicException; | 14 import org.chromium.net.QuicException; |
| 17 import org.chromium.net.RequestFinishedInfo; | 15 import org.chromium.net.RequestFinishedInfo; |
| 18 import org.chromium.net.RequestPriority; | 16 import org.chromium.net.RequestPriority; |
| 19 import org.chromium.net.UploadDataProvider; | 17 import org.chromium.net.UploadDataProvider; |
| 20 import org.chromium.net.UrlRequest; | 18 import org.chromium.net.UrlRequest; |
| 21 import org.chromium.net.UrlRequestException; | 19 import org.chromium.net.UrlRequestException; |
| 22 import org.chromium.net.UrlResponseInfo; | 20 import org.chromium.net.UrlResponseInfo; |
| 23 | 21 |
| 24 import java.nio.ByteBuffer; | 22 import java.nio.ByteBuffer; |
| 25 import java.util.AbstractMap; | 23 import java.util.AbstractMap; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 38 * All @CallByNative methods are called on native network thread | 36 * All @CallByNative methods are called on native network thread |
| 39 * and post tasks with listener calls onto Executor. Upon return from listener | 37 * and post tasks with listener calls onto Executor. Upon return from listener |
| 40 * callback native request adapter is called on executive thread and posts | 38 * callback native request adapter is called on executive thread and posts |
| 41 * native tasks to native network thread. Because Cancel could be called from | 39 * native tasks to native network thread. Because Cancel could be called from |
| 42 * any thread it is protected by mUrlRequestAdapterLock. | 40 * any thread it is protected by mUrlRequestAdapterLock. |
| 43 */ | 41 */ |
| 44 @JNINamespace("cronet") | 42 @JNINamespace("cronet") |
| 45 // Qualifies UrlRequest.StatusListener which is used in onStatus, a JNI method. | 43 // Qualifies UrlRequest.StatusListener which is used in onStatus, a JNI method. |
| 46 @JNIAdditionalImport(UrlRequest.class) | 44 @JNIAdditionalImport(UrlRequest.class) |
| 47 @VisibleForTesting | 45 @VisibleForTesting |
| 48 public final class CronetUrlRequest implements UrlRequest { | 46 public final class CronetUrlRequest extends UrlRequestBase { |
| 49 private final boolean mAllowDirectExecutor; | 47 private final boolean mAllowDirectExecutor; |
| 50 | 48 |
| 51 /* Native adapter object, owned by UrlRequest. */ | 49 /* Native adapter object, owned by UrlRequest. */ |
| 52 @GuardedBy("mUrlRequestAdapterLock") | 50 @GuardedBy("mUrlRequestAdapterLock") |
| 53 private long mUrlRequestAdapter; | 51 private long mUrlRequestAdapter; |
| 54 | 52 |
| 55 @GuardedBy("mUrlRequestAdapterLock") | 53 @GuardedBy("mUrlRequestAdapterLock") |
| 56 private boolean mStarted = false; | 54 private boolean mStarted = false; |
| 57 @GuardedBy("mUrlRequestAdapterLock") | 55 @GuardedBy("mUrlRequestAdapterLock") |
| 58 private boolean mWaitingOnRedirect = false; | 56 private boolean mWaitingOnRedirect = false; |
| (...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 Log.e(CronetUrlRequestContext.LOG_TAG, "Exception in onCompl
ete method", e); | 620 Log.e(CronetUrlRequestContext.LOG_TAG, "Exception in onCompl
ete method", e); |
| 623 } | 621 } |
| 624 } | 622 } |
| 625 }; | 623 }; |
| 626 postTaskToExecutor(task); | 624 postTaskToExecutor(task); |
| 627 } | 625 } |
| 628 | 626 |
| 629 /** | 627 /** |
| 630 * Called when error has occured, no callbacks will be called afterwards. | 628 * Called when error has occured, no callbacks will be called afterwards. |
| 631 * | 629 * |
| 632 * @param errorCode error code from {@link UrlRequestException.ERROR_LISTENE
R_EXCEPTION_THROWN | 630 * @param errorCode Error code represented by {@code UrlRequestError} that s
hould be mapped |
| 633 * UrlRequestException.ERROR_*}. | 631 * to one of {@link UrlRequestException#ERROR_LISTENER_EXCE
PTION_THROWN |
| 632 * UrlRequestException.ERROR_*}. |
| 634 * @param nativeError native net error code. | 633 * @param nativeError native net error code. |
| 635 * @param errorString textual representation of the error code. | 634 * @param errorString textual representation of the error code. |
| 636 * @param receivedBytesCount number of bytes received. | 635 * @param receivedBytesCount number of bytes received. |
| 637 */ | 636 */ |
| 638 @SuppressWarnings("unused") | 637 @SuppressWarnings("unused") |
| 639 @CalledByNative | 638 @CalledByNative |
| 640 private void onError(int errorCode, int nativeError, int nativeQuicError, St
ring errorString, | 639 private void onError(int errorCode, int nativeError, int nativeQuicError, St
ring errorString, |
| 641 long receivedBytesCount) { | 640 long receivedBytesCount) { |
| 642 mFinishedReason = RequestFinishedInfo.FAILED; | 641 mFinishedReason = RequestFinishedInfo.FAILED; |
| 643 if (mResponseInfo != null) { | 642 if (mResponseInfo != null) { |
| 644 mResponseInfo.setReceivedBytesCount( | 643 mResponseInfo.setReceivedBytesCount( |
| 645 mReceivedBytesCountFromRedirects + receivedBytesCount); | 644 mReceivedBytesCountFromRedirects + receivedBytesCount); |
| 646 } | 645 } |
| 647 if (errorCode == UrlRequestException.ERROR_QUIC_PROTOCOL_FAILED) { | 646 if (errorCode == UrlRequestException.ERROR_QUIC_PROTOCOL_FAILED) { |
| 648 failWithException(new QuicException( | 647 failWithException(new QuicException( |
| 649 "Exception in CronetUrlRequest: " + errorString, nativeError
, nativeQuicError)); | 648 "Exception in CronetUrlRequest: " + errorString, nativeError
, nativeQuicError)); |
| 650 } else { | 649 } else { |
| 650 int javaError = mapUrlRequestErrorToApiErrorCode(errorCode); |
| 651 failWithException(new UrlRequestException( | 651 failWithException(new UrlRequestException( |
| 652 "Exception in CronetUrlRequest: " + errorString, errorCode,
nativeError)); | 652 "Exception in CronetUrlRequest: " + errorString, javaError,
nativeError)); |
| 653 } | 653 } |
| 654 } | 654 } |
| 655 | 655 |
| 656 /** | 656 /** |
| 657 * Called when request is canceled, no callbacks will be called afterwards. | 657 * Called when request is canceled, no callbacks will be called afterwards. |
| 658 */ | 658 */ |
| 659 @SuppressWarnings("unused") | 659 @SuppressWarnings("unused") |
| 660 @CalledByNative | 660 @CalledByNative |
| 661 private void onCanceled() { | 661 private void onCanceled() { |
| 662 mFinishedReason = RequestFinishedInfo.CANCELED; | 662 mFinishedReason = RequestFinishedInfo.CANCELED; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 676 /** | 676 /** |
| 677 * Called by the native code when request status is fetched from the | 677 * Called by the native code when request status is fetched from the |
| 678 * native stack. | 678 * native stack. |
| 679 */ | 679 */ |
| 680 @SuppressWarnings("unused") | 680 @SuppressWarnings("unused") |
| 681 @CalledByNative | 681 @CalledByNative |
| 682 private void onStatus(final UrlRequest.StatusListener listener, final int lo
adState) { | 682 private void onStatus(final UrlRequest.StatusListener listener, final int lo
adState) { |
| 683 Runnable task = new Runnable() { | 683 Runnable task = new Runnable() { |
| 684 @Override | 684 @Override |
| 685 public void run() { | 685 public void run() { |
| 686 listener.onStatus(UrlRequest.Status.convertLoadState(loadState))
; | 686 listener.onStatus(convertLoadState(loadState)); |
| 687 } | 687 } |
| 688 }; | 688 }; |
| 689 postTaskToExecutor(task); | 689 postTaskToExecutor(task); |
| 690 } | 690 } |
| 691 | 691 |
| 692 /** | 692 /** |
| 693 * Called by the native code to report metrics. | 693 * Called by the native code to report metrics. |
| 694 */ | 694 */ |
| 695 @SuppressWarnings("unused") | 695 @SuppressWarnings("unused") |
| 696 @CalledByNative | 696 @CalledByNative |
| (...skipping 19 matching lines...) Expand all Loading... |
| 716 mResponseInfo, mException); | 716 mResponseInfo, mException); |
| 717 } | 717 } |
| 718 | 718 |
| 719 /** Enforces prohibition of direct execution. */ | 719 /** Enforces prohibition of direct execution. */ |
| 720 void checkCallingThread() { | 720 void checkCallingThread() { |
| 721 if (!mAllowDirectExecutor && mRequestContext.isNetworkThread(Thread.curr
entThread())) { | 721 if (!mAllowDirectExecutor && mRequestContext.isNetworkThread(Thread.curr
entThread())) { |
| 722 throw new InlineExecutionProhibitedException(); | 722 throw new InlineExecutionProhibitedException(); |
| 723 } | 723 } |
| 724 } | 724 } |
| 725 | 725 |
| 726 private int mapUrlRequestErrorToApiErrorCode(int errorCode) { |
| 727 switch (errorCode) { |
| 728 case UrlRequestError.LISTENER_EXCEPTION_THROWN: |
| 729 return UrlRequestException.ERROR_LISTENER_EXCEPTION_THROWN; |
| 730 case UrlRequestError.HOSTNAME_NOT_RESOLVED: |
| 731 return UrlRequestException.ERROR_HOSTNAME_NOT_RESOLVED; |
| 732 case UrlRequestError.INTERNET_DISCONNECTED: |
| 733 return UrlRequestException.ERROR_INTERNET_DISCONNECTED; |
| 734 case UrlRequestError.NETWORK_CHANGED: |
| 735 return UrlRequestException.ERROR_NETWORK_CHANGED; |
| 736 case UrlRequestError.TIMED_OUT: |
| 737 return UrlRequestException.ERROR_TIMED_OUT; |
| 738 case UrlRequestError.CONNECTION_CLOSED: |
| 739 return UrlRequestException.ERROR_CONNECTION_CLOSED; |
| 740 case UrlRequestError.CONNECTION_TIMED_OUT: |
| 741 return UrlRequestException.ERROR_CONNECTION_TIMED_OUT; |
| 742 case UrlRequestError.CONNECTION_REFUSED: |
| 743 return UrlRequestException.ERROR_CONNECTION_REFUSED; |
| 744 case UrlRequestError.CONNECTION_RESET: |
| 745 return UrlRequestException.ERROR_CONNECTION_RESET; |
| 746 case UrlRequestError.ADDRESS_UNREACHABLE: |
| 747 return UrlRequestException.ERROR_ADDRESS_UNREACHABLE; |
| 748 case UrlRequestError.QUIC_PROTOCOL_FAILED: |
| 749 return UrlRequestException.ERROR_QUIC_PROTOCOL_FAILED; |
| 750 case UrlRequestError.OTHER: |
| 751 return UrlRequestException.ERROR_OTHER; |
| 752 default: |
| 753 Log.e(CronetUrlRequestContext.LOG_TAG, "Unknown error code: " +
errorCode); |
| 754 return errorCode; |
| 755 } |
| 756 } |
| 757 |
| 726 // Native methods are implemented in cronet_url_request_adapter.cc. | 758 // Native methods are implemented in cronet_url_request_adapter.cc. |
| 727 | 759 |
| 728 private native long nativeCreateRequestAdapter(long urlRequestContextAdapter
, String url, | 760 private native long nativeCreateRequestAdapter(long urlRequestContextAdapter
, String url, |
| 729 int priority, boolean disableCache, boolean disableConnectionMigrati
on, | 761 int priority, boolean disableCache, boolean disableConnectionMigrati
on, |
| 730 boolean enableMetrics); | 762 boolean enableMetrics); |
| 731 | 763 |
| 732 @NativeClassQualifiedName("CronetURLRequestAdapter") | 764 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 733 private native boolean nativeSetHttpMethod(long nativePtr, String method); | 765 private native boolean nativeSetHttpMethod(long nativePtr, String method); |
| 734 | 766 |
| 735 @NativeClassQualifiedName("CronetURLRequestAdapter") | 767 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 736 private native boolean nativeAddRequestHeader(long nativePtr, String name, S
tring value); | 768 private native boolean nativeAddRequestHeader(long nativePtr, String name, S
tring value); |
| 737 | 769 |
| 738 @NativeClassQualifiedName("CronetURLRequestAdapter") | 770 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 739 private native void nativeStart(long nativePtr); | 771 private native void nativeStart(long nativePtr); |
| 740 | 772 |
| 741 @NativeClassQualifiedName("CronetURLRequestAdapter") | 773 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 742 private native void nativeFollowDeferredRedirect(long nativePtr); | 774 private native void nativeFollowDeferredRedirect(long nativePtr); |
| 743 | 775 |
| 744 @NativeClassQualifiedName("CronetURLRequestAdapter") | 776 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 745 private native boolean nativeReadData( | 777 private native boolean nativeReadData( |
| 746 long nativePtr, ByteBuffer byteBuffer, int position, int capacity); | 778 long nativePtr, ByteBuffer byteBuffer, int position, int capacity); |
| 747 | 779 |
| 748 @NativeClassQualifiedName("CronetURLRequestAdapter") | 780 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 749 private native void nativeDestroy(long nativePtr, boolean sendOnCanceled); | 781 private native void nativeDestroy(long nativePtr, boolean sendOnCanceled); |
| 750 | 782 |
| 751 @NativeClassQualifiedName("CronetURLRequestAdapter") | 783 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 752 private native void nativeGetStatus(long nativePtr, UrlRequest.StatusListene
r listener); | 784 private native void nativeGetStatus(long nativePtr, UrlRequest.StatusListene
r listener); |
| 753 } | 785 } |
| OLD | NEW |