Index: components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java |
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 104b7220197f4a273da0dfc35d066254f8464087..2285fb21a1900694e93df4e4b8342c00e9507ae7 100644 |
--- a/components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java |
+++ b/components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java |
@@ -5,7 +5,6 @@ |
package org.chromium.net; |
import android.util.Log; |
-import android.util.Pair; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.base.annotations.CalledByNative; |
@@ -14,11 +13,10 @@ import org.chromium.base.annotations.JNINamespace; |
import org.chromium.base.annotations.NativeClassQualifiedName; |
import java.nio.ByteBuffer; |
+import java.util.AbstractMap; |
import java.util.ArrayList; |
-import java.util.Collections; |
import java.util.List; |
import java.util.Map; |
-import java.util.TreeMap; |
import java.util.concurrent.Executor; |
import java.util.concurrent.RejectedExecutionException; |
@@ -73,7 +71,7 @@ final class CronetUrlRequest implements UrlRequest { |
private CronetUploadDataStream mUploadDataStream; |
- private NativeResponseInfo mResponseInfo; |
+ private UrlResponseInfo mResponseInfo; |
/* |
* Listener callback is repeatedly called when each read is completed, so it |
@@ -83,7 +81,7 @@ final class CronetUrlRequest implements UrlRequest { |
private Runnable mOnDestroyedCallbackForTests; |
- private static final class HeadersList extends ArrayList<Pair<String, String>> {} |
+ private static final class HeadersList extends ArrayList<Map.Entry<String, String>> {} |
private final class OnReadCompletedRunnable implements Runnable { |
ByteBuffer mByteBuffer; |
@@ -113,113 +111,6 @@ final class CronetUrlRequest implements UrlRequest { |
} |
} |
- private static final class NativeResponseInfo implements ResponseInfo { |
- private final String[] mResponseInfoUrlChain; |
- private final int mHttpStatusCode; |
- private final String mHttpStatusText; |
- private final boolean mWasCached; |
- private final String mNegotiatedProtocol; |
- private final String mProxyServer; |
- private final HeadersList mAllHeaders = new HeadersList(); |
- private Map<String, List<String>> mResponseHeaders; |
- private List<Pair<String, String>> mUnmodifiableAllHeaders; |
- |
- NativeResponseInfo(String[] urlChain, int httpStatusCode, |
- String httpStatusText, boolean wasCached, |
- String negotiatedProtocol, String proxyServer) { |
- mResponseInfoUrlChain = urlChain; |
- mHttpStatusCode = httpStatusCode; |
- mHttpStatusText = httpStatusText; |
- mWasCached = wasCached; |
- mNegotiatedProtocol = negotiatedProtocol; |
- mProxyServer = proxyServer; |
- } |
- |
- @Override |
- public String getUrl() { |
- return mResponseInfoUrlChain[mResponseInfoUrlChain.length - 1]; |
- } |
- |
- @Override |
- public String[] getUrlChain() { |
- return mResponseInfoUrlChain; |
- } |
- |
- @Override |
- public int getHttpStatusCode() { |
- return mHttpStatusCode; |
- } |
- |
- @Override |
- public String getHttpStatusText() { |
- return mHttpStatusText; |
- } |
- |
- @Override |
- public List<Pair<String, String>> getAllHeadersAsList() { |
- if (mUnmodifiableAllHeaders == null) { |
- mUnmodifiableAllHeaders = |
- Collections.unmodifiableList(mAllHeaders); |
- } |
- return mUnmodifiableAllHeaders; |
- } |
- |
- @Override |
- public Map<String, List<String>> getAllHeaders() { |
- if (mResponseHeaders != null) { |
- return mResponseHeaders; |
- } |
- Map<String, List<String>> map = new TreeMap<String, List<String>>( |
- String.CASE_INSENSITIVE_ORDER); |
- for (Pair<String, String> entry : mAllHeaders) { |
- List<String> values = new ArrayList<String>(); |
- if (map.containsKey(entry.first)) { |
- values.addAll(map.get(entry.first)); |
- } |
- values.add(entry.second); |
- map.put(entry.first, Collections.unmodifiableList(values)); |
- } |
- mResponseHeaders = Collections.unmodifiableMap(map); |
- return mResponseHeaders; |
- } |
- |
- @Override |
- public boolean wasCached() { |
- return mWasCached; |
- } |
- |
- @Override |
- public String getNegotiatedProtocol() { |
- return mNegotiatedProtocol; |
- } |
- |
- @Override |
- public String getProxyServer() { |
- return mProxyServer; |
- } |
- }; |
- |
- private static final class NativeExtendedResponseInfo implements ExtendedResponseInfo { |
- private final ResponseInfo mResponseInfo; |
- private final long mTotalReceivedBytes; |
- |
- NativeExtendedResponseInfo(ResponseInfo responseInfo, |
- long totalReceivedBytes) { |
- mResponseInfo = responseInfo; |
- mTotalReceivedBytes = totalReceivedBytes; |
- } |
- |
- @Override |
- public ResponseInfo getResponseInfo() { |
- return mResponseInfo; |
- } |
- |
- @Override |
- public long getTotalReceivedBytes() { |
- return mTotalReceivedBytes; |
- } |
- }; |
- |
CronetUrlRequest(CronetUrlRequestContext requestContext, |
long urlRequestContextAdapter, |
String url, |
@@ -262,7 +153,7 @@ final class CronetUrlRequest implements UrlRequest { |
if (value == null) { |
throw new NullPointerException("Invalid header value."); |
} |
- mRequestHeaders.add(Pair.create(header, value)); |
+ mRequestHeaders.add(new AbstractMap.SimpleImmutableEntry<String, String>(header, value)); |
} |
@Override |
@@ -292,15 +183,16 @@ final class CronetUrlRequest implements UrlRequest { |
} |
boolean hasContentType = false; |
- for (Pair<String, String> header : mRequestHeaders) { |
- if (header.first.equalsIgnoreCase("Content-Type") |
- && !header.second.isEmpty()) { |
+ for (Map.Entry<String, String> header : mRequestHeaders) { |
+ if (header.getKey().equalsIgnoreCase("Content-Type") |
+ && !header.getValue().isEmpty()) { |
hasContentType = true; |
} |
- if (!nativeAddRequestHeader(mUrlRequestAdapter, header.first, header.second)) { |
+ if (!nativeAddRequestHeader( |
+ mUrlRequestAdapter, header.getKey(), header.getValue())) { |
destroyRequestAdapter(); |
throw new IllegalArgumentException( |
- "Invalid header " + header.first + "=" + header.second); |
+ "Invalid header " + header.getKey() + "=" + header.getValue()); |
} |
} |
if (mUploadDataStream != null) { |
@@ -481,8 +373,7 @@ final class CronetUrlRequest implements UrlRequest { |
} |
} |
- private NativeResponseInfo prepareResponseInfoOnNetworkThread( |
- int httpStatusCode) { |
+ private UrlResponseInfo prepareResponseInfoOnNetworkThread(int httpStatusCode) { |
long urlRequestAdapter; |
synchronized (mUrlRequestAdapterLock) { |
if (mUrlRequestAdapter == 0) { |
@@ -494,15 +385,14 @@ final class CronetUrlRequest implements UrlRequest { |
// safe to preserve and use urlRequestAdapter outside the lock. |
urlRequestAdapter = mUrlRequestAdapter; |
} |
- NativeResponseInfo responseInfo = new NativeResponseInfo( |
- mUrlChain.toArray(new String[mUrlChain.size()]), |
- httpStatusCode, |
- nativeGetHttpStatusText(urlRequestAdapter), |
+ HeadersList headersList = new HeadersList(); |
+ nativePopulateResponseHeaders(urlRequestAdapter, headersList); |
+ |
+ UrlResponseInfo responseInfo = new UrlResponseInfo(new ArrayList<String>(mUrlChain), |
+ httpStatusCode, nativeGetHttpStatusText(urlRequestAdapter), headersList, |
nativeGetWasCached(urlRequestAdapter), |
nativeGetNegotiatedProtocol(urlRequestAdapter), |
nativeGetProxyServer(urlRequestAdapter)); |
- nativePopulateResponseHeaders(urlRequestAdapter, |
- responseInfo.mAllHeaders); |
return responseInfo; |
} |
@@ -606,8 +496,7 @@ final class CronetUrlRequest implements UrlRequest { |
@CalledByNative |
private void onReceivedRedirect(final String newLocation, |
int httpStatusCode) { |
- final NativeResponseInfo responseInfo = |
- prepareResponseInfoOnNetworkThread(httpStatusCode); |
+ final UrlResponseInfo responseInfo = prepareResponseInfoOnNetworkThread(httpStatusCode); |
// Have to do this after creating responseInfo. |
mUrlChain.add(newLocation); |
@@ -701,9 +590,7 @@ final class CronetUrlRequest implements UrlRequest { |
@SuppressWarnings("unused") |
@CalledByNative |
private void onSucceeded(long totalReceivedBytes) { |
- final NativeExtendedResponseInfo extendedResponseInfo = |
- new NativeExtendedResponseInfo(mResponseInfo, |
- totalReceivedBytes); |
+ mResponseInfo.setReceivedBytesCount(totalReceivedBytes); |
Runnable task = new Runnable() { |
public void run() { |
synchronized (mUrlRequestAdapterLock) { |
@@ -715,8 +602,7 @@ final class CronetUrlRequest implements UrlRequest { |
destroyRequestAdapter(); |
} |
try { |
- mListener.onSucceeded(CronetUrlRequest.this, |
- extendedResponseInfo); |
+ mListener.onSucceeded(CronetUrlRequest.this, mResponseInfo); |
} catch (Exception e) { |
Log.e(CronetUrlRequestContext.LOG_TAG, |
"Exception in onComplete method", e); |
@@ -748,7 +634,7 @@ final class CronetUrlRequest implements UrlRequest { |
@CalledByNative |
private void onAppendResponseHeader(HeadersList headersList, |
String name, String value) { |
- headersList.add(Pair.create(name, value)); |
+ headersList.add(new AbstractMap.SimpleImmutableEntry<String, String>(name, value)); |
} |
/** |