| Index: components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
|
| diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
|
| index 62a77ec92db4727b3676ea1be9a586fb7c21a6a4..a8befa391b499b3e3256524be323134b73126efa 100644
|
| --- a/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
|
| +++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
|
| @@ -85,7 +85,9 @@ public class CronetBidirectionalStream extends BidirectionalStream {
|
| private final String mInitialMethod;
|
| private final String mRequestHeaders[];
|
| private final boolean mDelayRequestHeadersUntilFirstFlush;
|
| + private final boolean mEnableMetricsCollection;
|
| private final Collection<Object> mRequestAnnotations;
|
| +
|
| /*
|
| * Synchronizes access to mNativeStream, mReadState and mWriteState.
|
| */
|
| @@ -224,7 +226,8 @@ public class CronetBidirectionalStream extends BidirectionalStream {
|
| CronetBidirectionalStream(CronetUrlRequestContext requestContext, String url,
|
| @BidirectionalStream.Builder.StreamPriority int priority, Callback callback,
|
| Executor executor, String httpMethod, List<Map.Entry<String, String>> requestHeaders,
|
| - boolean delayRequestHeadersUntilNextFlush, Collection<Object> requestAnnotations) {
|
| + boolean delayRequestHeadersUntilNextFlush, Collection<Object> requestAnnotations,
|
| + boolean enableMetricsCollection) {
|
| mRequestContext = requestContext;
|
| mInitialUrl = url;
|
| mInitialPriority = convertStreamPriority(priority);
|
| @@ -236,6 +239,7 @@ public class CronetBidirectionalStream extends BidirectionalStream {
|
| mPendingData = new LinkedList<>();
|
| mFlushData = new LinkedList<>();
|
| mRequestAnnotations = requestAnnotations;
|
| + mEnableMetricsCollection = enableMetricsCollection;
|
| }
|
|
|
| @Override
|
| @@ -247,7 +251,7 @@ public class CronetBidirectionalStream extends BidirectionalStream {
|
| try {
|
| mNativeStream = nativeCreateBidirectionalStream(
|
| mRequestContext.getUrlRequestContextAdapter(),
|
| - !mDelayRequestHeadersUntilFirstFlush);
|
| + !mDelayRequestHeadersUntilFirstFlush, mEnableMetricsCollection);
|
| mRequestContext.onRequestStarted();
|
| // Non-zero startResult means an argument error.
|
| int startResult = nativeStart(mNativeStream, mInitialUrl, mInitialPriority,
|
| @@ -619,6 +623,32 @@ public class CronetBidirectionalStream extends BidirectionalStream {
|
| });
|
| }
|
|
|
| + /**
|
| + * Called by the native code to report metrics just before the native adapter is destroyed.
|
| + */
|
| + @SuppressWarnings("unused")
|
| + @CalledByNative
|
| + private void onMetricsCollected(long requestStartMs, long dnsStartMs, long dnsEndMs,
|
| + long connectStartMs, long connectEndMs, long sslStartMs, long sslEndMs,
|
| + long sendingStartMs, long sendingEndMs, long pushStartMs, long pushEndMs,
|
| + long responseStartMs, long responseEndMs, boolean socketReused, long sentBytesCount,
|
| + long receivedBytesCount) {
|
| + synchronized (mNativeStreamLock) {
|
| + if (mMetrics != null) {
|
| + throw new IllegalStateException("Metrics collection should only happen once.");
|
| + }
|
| + mMetrics = new CronetMetrics(requestStartMs, dnsStartMs, dnsEndMs, connectStartMs,
|
| + connectEndMs, sslStartMs, sslEndMs, sendingStartMs, sendingEndMs, pushStartMs,
|
| + pushEndMs, responseStartMs, responseEndMs, socketReused, sentBytesCount,
|
| + receivedBytesCount);
|
| + // TODO(xunjieli): Fill this with real values.
|
| + final RequestFinishedInfo requestFinishedInfo =
|
| + new RequestFinishedInfo(mInitialUrl, mRequestAnnotations, mMetrics,
|
| + RequestFinishedInfo.SUCCEEDED, mResponseInfo, null);
|
| + mRequestContext.reportFinished(requestFinishedInfo);
|
| + }
|
| + }
|
| +
|
| @VisibleForTesting
|
| public void setOnDestroyedCallbackForTesting(Runnable onDestroyedCallbackForTesting) {
|
| mOnDestroyedCallbackForTesting = onDestroyedCallbackForTesting;
|
| @@ -699,7 +729,6 @@ public class CronetBidirectionalStream extends BidirectionalStream {
|
| return;
|
| }
|
| nativeDestroy(mNativeStream, sendOnCanceled);
|
| - mRequestContext.reportFinished(getRequestFinishedInfo());
|
| mRequestContext.onRequestDestroyed();
|
| mNativeStream = 0;
|
| if (mOnDestroyedCallbackForTesting != null) {
|
| @@ -707,12 +736,6 @@ public class CronetBidirectionalStream extends BidirectionalStream {
|
| }
|
| }
|
|
|
| - private RequestFinishedInfo getRequestFinishedInfo() {
|
| - // TODO(xunjieli): Fill this with real values.
|
| - return new RequestFinishedInfo(mInitialUrl, mRequestAnnotations, mMetrics,
|
| - RequestFinishedInfo.SUCCEEDED, mResponseInfo, null);
|
| - }
|
| -
|
| /**
|
| * Fails the stream with an exception. Only called on the Executor.
|
| */
|
| @@ -757,8 +780,8 @@ public class CronetBidirectionalStream extends BidirectionalStream {
|
| }
|
|
|
| // Native methods are implemented in cronet_bidirectional_stream_adapter.cc.
|
| - private native long nativeCreateBidirectionalStream(
|
| - long urlRequestContextAdapter, boolean sendRequestHeadersAutomatically);
|
| + private native long nativeCreateBidirectionalStream(long urlRequestContextAdapter,
|
| + boolean sendRequestHeadersAutomatically, boolean enableMetricsCollection);
|
|
|
| @NativeClassQualifiedName("CronetBidirectionalStreamAdapter")
|
| private native int nativeStart(long nativePtr, String url, int priority, String method,
|
|
|