Index: components/cronet/android/java/src/org/chromium/net/ChromiumUrlRequest.java |
diff --git a/components/cronet/android/java/src/org/chromium/net/ChromiumUrlRequest.java b/components/cronet/android/java/src/org/chromium/net/ChromiumUrlRequest.java |
index 05f933fed38ff8f74fd9942190623386aaed1ca9..1c6ea3d19e23c596e45792c1436a8142376b6be7 100644 |
--- a/components/cronet/android/java/src/org/chromium/net/ChromiumUrlRequest.java |
+++ b/components/cronet/android/java/src/org/chromium/net/ChromiumUrlRequest.java |
@@ -50,19 +50,37 @@ public class ChromiumUrlRequest implements HttpUrlRequest { |
private volatile boolean mRecycled; |
private volatile boolean mFinished; |
private boolean mHeadersAvailable; |
- private String mContentType; |
private long mUploadContentLength; |
private final HttpUrlRequestListener mListener; |
private boolean mBufferFullResponse; |
private long mOffset; |
- private long mContentLength; |
private long mContentLengthLimit; |
private boolean mCancelIfContentLengthOverLimit; |
private boolean mContentLengthOverLimit; |
private boolean mSkippingToOffset; |
private long mSize; |
+ |
// Indicates whether redirects have been disabled. |
private boolean mDisableRedirects; |
+ |
+ // Http status code. Default to 0. Populated in onResponseStarted(). |
+ private int mHttpStatusCode = 0; |
+ |
+ // Http status text. Default to null. Populated in onResponseStarted(). |
+ private String mHttpStatusText; |
+ |
+ // Content type. Default to null. Populated in onResponseStarted(). |
+ private String mContentType; |
+ |
+ // Compressed content length as reported by the server. Populated in onResponseStarted(). |
+ private long mContentLength; |
+ |
+ // Native error code. Default to no error. Populated in onRequestComplete(). |
+ private int mErrorCode = ChromiumUrlRequestError.SUCCESS; |
+ |
+ // Native error string. Default to null. Populated in onRequestComplete(). |
+ private String mErrorString; |
+ |
private final Object mLock = new Object(); |
public ChromiumUrlRequest(ChromiumUrlRequestContext requestContext, |
@@ -132,26 +150,24 @@ public class ChromiumUrlRequest implements HttpUrlRequest { |
@Override |
public int getHttpStatusCode() { |
- int httpStatusCode = nativeGetHttpStatusCode(mUrlRequestAdapter); |
- |
// TODO(mef): Investigate the following: |
// If we have been able to successfully resume a previously interrupted |
// download, the status code will be 206, not 200. Since the rest of the |
// application is expecting 200 to indicate success, we need to fake it. |
- if (httpStatusCode == 206) { |
- httpStatusCode = 200; |
+ if (mHttpStatusCode == 206) { |
+ return 200; |
} |
- return httpStatusCode; |
+ return mHttpStatusCode; |
} |
@Override |
public String getHttpStatusText() { |
- return nativeGetHttpStatusText(mUrlRequestAdapter); |
+ return mHttpStatusText; |
} |
/** |
- * Returns an exception if any, or null if the request was completed |
- * successfully. |
+ * Returns an exception if any, or null if the request has not completed or |
+ * completed successfully. |
*/ |
@Override |
public IOException getException() { |
@@ -159,18 +175,14 @@ public class ChromiumUrlRequest implements HttpUrlRequest { |
return mSinkException; |
} |
- validateNotRecycled(); |
- |
- int errorCode = nativeGetErrorCode(mUrlRequestAdapter); |
- switch (errorCode) { |
+ switch (mErrorCode) { |
case ChromiumUrlRequestError.SUCCESS: |
if (mContentLengthOverLimit) { |
return new ResponseTooLargeException(); |
} |
return null; |
case ChromiumUrlRequestError.UNKNOWN: |
- return new IOException( |
- nativeGetErrorString(mUrlRequestAdapter)); |
+ return new IOException(mErrorString); |
case ChromiumUrlRequestError.MALFORMED_URL: |
return new MalformedURLException("Malformed URL: " + mUrl); |
case ChromiumUrlRequestError.CONNECTION_TIMED_OUT: |
@@ -188,7 +200,7 @@ public class ChromiumUrlRequest implements HttpUrlRequest { |
+ "many redirects or redirects have been disabled"); |
default: |
throw new IllegalStateException( |
- "Unrecognized error code: " + errorCode); |
+ "Unrecognized error code: " + mErrorCode); |
} |
} |
@@ -463,6 +475,17 @@ public class ChromiumUrlRequest implements HttpUrlRequest { |
* A callback invoked when the response has been fully consumed. |
*/ |
private void onRequestComplete() { |
+ mErrorCode = nativeGetErrorCode(mUrlRequestAdapter); |
+ mErrorString = nativeGetErrorString(mUrlRequestAdapter); |
+ // When there is an error or redirects have been disabled, |
+ // onResponseStarted is often not invoked. |
+ // Populate status code and status text if that's the case. |
+ // Note that besides redirects, these two fields may be set on the |
+ // request for AUTH and CERT requests. |
+ if (mErrorCode != ChromiumUrlRequestError.SUCCESS) { |
+ mHttpStatusCode = nativeGetHttpStatusCode(mUrlRequestAdapter); |
+ mHttpStatusText = nativeGetHttpStatusText(mUrlRequestAdapter); |
+ } |
mListener.onRequestComplete(this); |
} |
@@ -515,6 +538,8 @@ public class ChromiumUrlRequest implements HttpUrlRequest { |
@CalledByNative |
private void onResponseStarted() { |
try { |
+ mHttpStatusCode = nativeGetHttpStatusCode(mUrlRequestAdapter); |
+ mHttpStatusText = nativeGetHttpStatusText(mUrlRequestAdapter); |
mContentType = nativeGetContentType(mUrlRequestAdapter); |
mContentLength = nativeGetContentLength(mUrlRequestAdapter); |
mHeadersAvailable = true; |
@@ -536,7 +561,7 @@ public class ChromiumUrlRequest implements HttpUrlRequest { |
// The server may ignore the request for a byte range, in which |
// case status code will be 200, instead of 206. Note that we |
// cannot call getHttpStatusCode as it rewrites 206 into 200. |
- if (nativeGetHttpStatusCode(mUrlRequestAdapter) == 200) { |
+ if (mHttpStatusCode == 200) { |
// TODO(mef): Revisit this logic. |
if (mContentLength != -1) { |
mContentLength -= mOffset; |