Chromium Code Reviews| Index: components/cronet/android/api/src/org/chromium/net/RequestFinishedInfo.java |
| diff --git a/components/cronet/android/api/src/org/chromium/net/RequestFinishedInfo.java b/components/cronet/android/api/src/org/chromium/net/RequestFinishedInfo.java |
| index 6f1c9ab457d0dc222d0a9b3ba33c6153c9ae122d..b8cac0ce66997403f313a83ab1ffa0bbf0379ef0 100644 |
| --- a/components/cronet/android/api/src/org/chromium/net/RequestFinishedInfo.java |
| +++ b/components/cronet/android/api/src/org/chromium/net/RequestFinishedInfo.java |
| @@ -7,6 +7,7 @@ package org.chromium.net; |
| import android.support.annotation.Nullable; |
| import java.util.Collection; |
| +import java.util.Date; |
| import java.util.concurrent.Executor; |
| /** |
| @@ -49,10 +50,49 @@ public final class RequestFinishedInfo { |
| /** |
| * Metrics collected for a single request. |
| * |
| + * Most timing metrics are taken from |
| + * {@link https://cs.chromium.org/chromium/src/net/base/load_timing_info.h LoadTimingInfo}. |
| + * See that file for more information about how to interpret them. |
| + * |
| + * Start times are reported as the time when a request started blocking on event, not when the |
| + * event actually occurred, with the exception of push start. If a metric is not meaningful or |
| + * not available, start and end times will be null. If no time was spent blocking on an event, |
| + * start and end will be the same time. |
| + * |
| * {@hide} as it's a prototype. |
| */ |
| public static class Metrics { |
| @Nullable |
| + private final long mProxyStartMs; |
| + @Nullable |
| + private final long mProxyEndMs; |
| + @Nullable |
| + private final long mDnsStartMs; |
| + @Nullable |
| + private final long mDnsEndMs; |
| + @Nullable |
| + private final long mConnectStartMs; |
| + @Nullable |
| + private final long mConnectEndMs; |
| + @Nullable |
| + private final long mSslStartMs; |
| + @Nullable |
|
mef
2016/08/10 03:03:37
Is simple long nullable or do you need to use Long
mgersh
2016/08/29 18:05:44
I didn't actually want to make these nullable, the
|
| + private final long mSslEndMs; |
| + @Nullable |
| + private final long mSendingStartMs; |
| + @Nullable |
| + private final long mSendingEndMs; |
| + @Nullable |
| + private final long mPushStartMs; |
| + @Nullable |
| + private final long mPushEndMs; |
| + @Nullable |
| + private final long mResponseStartMs; |
| + @Nullable |
| + private final long mResponseEndMs; |
| + private final boolean mSocketReused; |
| + |
| + @Nullable |
| private final Long mTtfbMs; |
| @Nullable |
| private final Long mTotalTimeMs; |
| @@ -61,12 +101,198 @@ public final class RequestFinishedInfo { |
| @Nullable |
| private final Long mReceivedBytesCount; |
| + /** |
| + * Old-style constructor |
| + */ |
| public Metrics(@Nullable Long ttfbMs, @Nullable Long totalTimeMs, |
| @Nullable Long sentBytesCount, @Nullable Long receivedBytesCount) { |
| mTtfbMs = ttfbMs; |
| mTotalTimeMs = totalTimeMs; |
| mSentBytesCount = sentBytesCount; |
| mReceivedBytesCount = receivedBytesCount; |
| + |
| + // Everything else is 0 for now |
| + mProxyStartMs = 0; |
| + mProxyEndMs = 0; |
| + mDnsStartMs = 0; |
| + mDnsEndMs = 0; |
| + mConnectStartMs = 0; |
| + mConnectEndMs = 0; |
| + mSslStartMs = 0; |
| + mSslEndMs = 0; |
| + mSendingStartMs = 0; |
| + mSendingEndMs = 0; |
| + mPushStartMs = 0; |
| + mPushEndMs = 0; |
| + mResponseStartMs = 0; |
| + mResponseEndMs = 0; |
| + mSocketReused = false; |
| + } |
| + |
| + /** |
| + * New-style constructor |
| + */ |
| + public Metrics(long proxyStartMs, long proxyEndMs, 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) { |
| + mProxyStartMs = proxyStartMs; |
| + mProxyEndMs = proxyEndMs; |
|
mef
2016/08/10 03:03:37
shouldall these constructors and member variables
mgersh
2016/08/29 18:05:44
Done.
|
| + mDnsStartMs = dnsStartMs; |
| + mDnsEndMs = dnsEndMs; |
| + mConnectStartMs = connectStartMs; |
| + mConnectEndMs = connectEndMs; |
| + mSslStartMs = sslStartMs; |
| + mSslEndMs = sslEndMs; |
| + mSendingStartMs = sendingStartMs; |
| + mSendingEndMs = sendingEndMs; |
| + mPushStartMs = pushStartMs; |
| + mPushEndMs = pushEndMs; |
| + mResponseStartMs = responseStartMs; |
| + mResponseEndMs = responseEndMs; |
| + mSocketReused = socketReused; |
| + mSentBytesCount = sentBytesCount; |
| + mReceivedBytesCount = receivedBytesCount; |
| + |
| + // Don't care about these anymore |
| + mTtfbMs = null; |
| + mTotalTimeMs = null; |
| + } |
| + |
| + @Nullable |
| + private static Date toDate(long timestamp) { |
| + if (timestamp != 0) { |
| + return new Date(timestamp); |
| + } |
| + return null; |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when proxy resolution started. Null if there |
| + * is no PAC. |
| + */ |
| + @Nullable |
| + public Date getProxyStart() { |
| + return toDate(mProxyStartMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when proxy resolution finished. Null if there |
| + * is no PAC. |
| + */ |
| + @Nullable |
| + public Date getProxyEnd() { |
| + return toDate(mProxyEndMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when DNS lookup started. |
| + */ |
| + @Nullable |
| + public Date getDnsStart() { |
| + return toDate(mDnsStartMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when DNS lookup finished. |
| + */ |
| + @Nullable |
| + public Date getDnsEnd() { |
| + return toDate(mDnsEndMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when connection establishment started. |
| + */ |
| + @Nullable |
| + public Date getConnectStart() { |
| + return toDate(mConnectStartMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when connection establishment finished. |
| + */ |
| + @Nullable |
| + public Date getConnectEnd() { |
| + return toDate(mConnectEndMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when SSL handshake started. |
| + */ |
| + @Nullable |
| + public Date getSslStart() { |
| + return toDate(mSslStartMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when SSL handshake finished. |
| + */ |
| + @Nullable |
| + public Date getSslEnd() { |
| + return toDate(mSslEndMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when sending HTTP request headers started. |
| + */ |
| + @Nullable |
| + public Date getSendingStart() { |
| + return toDate(mSendingStartMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when sending HTTP request body finished. |
| + */ |
| + @Nullable |
| + public Date getSendingEnd() { |
| + return toDate(mSendingEndMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when the first byte of an HTTP2 server push |
| + * was received. |
| + */ |
| + @Nullable |
| + public Date getPushStart() { |
| + return toDate(mPushStartMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when the last byte of an HTTP2 server push |
| + * was received. |
|
mef
2016/08/10 03:03:37
For all @Nullable results we need to explain the s
|
| + */ |
| + @Nullable |
| + public Date getPushEnd() { |
| + return toDate(mPushEndMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when the first byte of the response was |
| + * received. |
| + */ |
| + @Nullable |
| + public Date getResponseStart() { |
| + return toDate(mResponseStartMs); |
| + } |
| + |
| + /** |
| + * @return {@link java.util.Date} representing when the last byte of the response was |
| + * received. |
| + */ |
| + @Nullable |
| + public Date getResponseEnd() { |
| + return toDate(mResponseEndMs); |
| + } |
| + |
| + /** |
| + * @return whether the socket was reused. When true, DNS, connection, and SSL times will be |
| + * null. |
| + */ |
| + @Nullable |
| + public boolean getSocketReused() { |
| + return mSocketReused; |
| } |
| /** |
| @@ -104,21 +330,32 @@ public final class RequestFinishedInfo { |
| } |
| } |
| + public static final int SUCCEEDED = 0; |
| + public static final int FAILED = 1; |
| + public static final int CANCELED = 2; |
| + |
| private final String mUrl; |
| private final Collection<Object> mAnnotations; |
| private final Metrics mMetrics; |
| + // One of SUCCEEDED, FAILED, or CANCELED |
| + private final int mFinishedReason; |
| @Nullable |
| private final UrlResponseInfo mResponseInfo; |
| + @Nullable |
| + private final UrlRequestException mException; |
| /** |
| * @hide only used by internal implementation. |
| */ |
| public RequestFinishedInfo(String url, Collection<Object> annotations, Metrics metrics, |
| - @Nullable UrlResponseInfo responseInfo) { |
| + int finishedReason, @Nullable UrlResponseInfo responseInfo, |
| + @Nullable UrlRequestException exception) { |
| mUrl = url; |
| mAnnotations = annotations; |
| mMetrics = metrics; |
| + mFinishedReason = finishedReason; |
| mResponseInfo = responseInfo; |
| + mException = exception; |
| } |
| /** Returns the request's original URL. */ |
| @@ -132,6 +369,7 @@ public final class RequestFinishedInfo { |
| } |
| // TODO(klm): Collect and return a chain of Metrics objects for redirect responses. |
| + // TODO(mgersh): Update this javadoc when new metrics are fully implemented |
| /** |
| * Returns metrics collected for this request. |
| * |
| @@ -149,6 +387,14 @@ public final class RequestFinishedInfo { |
| } |
| /** |
| + * Returns the reason why the request finished. |
| + * @return one of {@link #SUCCEEDED}, {@link #FAILED}, or {@link #CANCELED} |
| + */ |
| + public int getFinishedReason() { |
| + return mFinishedReason; |
| + } |
| + |
| + /** |
| * Returns a {@link UrlResponseInfo} for the request, if its response had started. |
| * @return {@link UrlResponseInfo} for the request, if its response had started. |
| */ |
| @@ -156,4 +402,15 @@ public final class RequestFinishedInfo { |
| public UrlResponseInfo getResponseInfo() { |
| return mResponseInfo; |
| } |
| + |
| + /** |
| + * If the request failed, returns the same {@link UrlRequestException} provided to |
| + * {@link UrlRequest.Callback#onFailed}. |
| + * |
| + * @return the request's {@link UrlRequestException}, if the request failed |
| + */ |
| + @Nullable |
| + public UrlRequestException getException() { |
| + return mException; |
| + } |
| } |