Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(941)

Side by Side Diff: components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java

Issue 784853004: [Cronet] Implement methods to get response headers in HttpURLConnection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Self review Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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; 5 package org.chromium.net;
6 6
7 import android.util.Log; 7 import android.util.Log;
8 import android.util.Pair; 8 import android.util.Pair;
9 9
10 import org.chromium.base.CalledByNative; 10 import org.chromium.base.CalledByNative;
11 import org.chromium.base.JNINamespace; 11 import org.chromium.base.JNINamespace;
12 import org.chromium.base.annotations.SuppressFBWarnings;
12 13
13 import java.nio.ByteBuffer; 14 import java.nio.ByteBuffer;
14 import java.util.ArrayList; 15 import java.util.ArrayList;
15 import java.util.Collections; 16 import java.util.Collections;
16 import java.util.HashMap; 17 import java.util.Comparator;
17 import java.util.List; 18 import java.util.List;
18 import java.util.Map; 19 import java.util.Map;
20 import java.util.TreeMap;
19 import java.util.concurrent.Executor; 21 import java.util.concurrent.Executor;
20 22
21 /** 23 /**
22 * UrlRequest using Chromium HTTP stack implementation. Could be accessed from 24 * UrlRequest using Chromium HTTP stack implementation. Could be accessed from
23 * any thread on Executor. Cancel can be done from any thread. 25 * any thread on Executor. Cancel can be done from any thread.
24 * All @CallByNative methods are called on native network thread 26 * All @CallByNative methods are called on native network thread
25 * and post tasks with listener calls onto Executor. Upon return from listener 27 * and post tasks with listener calls onto Executor. Upon return from listener
26 * callback native request adapter is called on executive thread and posts 28 * callback native request adapter is called on executive thread and posts
27 * native tasks to native network thread. Because Cancel could be called from 29 * native tasks to native network thread. Because Cancel could be called from
28 * any thread it is protected by mUrlRequestAdapterLock. 30 * any thread it is protected by mUrlRequestAdapterLock.
(...skipping 28 matching lines...) Expand all
57 private final HeadersList mRequestHeaders = new HeadersList(); 59 private final HeadersList mRequestHeaders = new HeadersList();
58 60
59 private NativeResponseInfo mResponseInfo; 61 private NativeResponseInfo mResponseInfo;
60 62
61 /* 63 /*
62 * Listener callback is repeatedly called when data is received, so it is 64 * Listener callback is repeatedly called when data is received, so it is
63 * cached as member variable. 65 * cached as member variable.
64 */ 66 */
65 private OnDataReceivedRunnable mOnDataReceivedTask; 67 private OnDataReceivedRunnable mOnDataReceivedTask;
66 68
69 // TODO(xunjieli): Share it with CronetHttpURLConnection.
70 private static final Comparator<String> FIELD_NAME_COMPARATOR =
71 new Comparator<String>() {
72 @Override
73 @SuppressFBWarnings("ES_STRING_EQUALS")
mmenke 2015/01/16 19:43:13 Rather than suppress the warning, maybe just: if
xunjieli 2015/01/16 20:01:12 Done. That's solved my problem. Didn't see it earl
74 public int compare(String a, String b) {
75 if (a == b) {
76 return 0;
77 } else if (a == null) {
mmenke 2015/01/16 19:43:13 Actually...Can we even have NULL response header s
xunjieli 2015/01/16 20:01:12 The default implementation has a null key which co
mmenke 2015/01/16 20:03:59 My opinion on this (And others may disagree, thoug
78 return -1;
79 } else if (b == null) {
80 return 1;
81 } else {
82 return String.CASE_INSENSITIVE_ORDER.compare(a, b);
83 }
84 }
85 };
86
67 static final class HeadersList extends ArrayList<Pair<String, String>> { 87 static final class HeadersList extends ArrayList<Pair<String, String>> {
68 } 88 }
69 89
70 final class OnDataReceivedRunnable implements Runnable { 90 final class OnDataReceivedRunnable implements Runnable {
71 ByteBuffer mByteBuffer; 91 ByteBuffer mByteBuffer;
72 92
73 public void run() { 93 public void run() {
74 if (isCanceled()) { 94 if (isCanceled()) {
75 return; 95 return;
76 } 96 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 } 130 }
111 } 131 }
112 132
113 static final class NativeResponseInfo implements ResponseInfo { 133 static final class NativeResponseInfo implements ResponseInfo {
114 private final String[] mResponseInfoUrlChain; 134 private final String[] mResponseInfoUrlChain;
115 private final int mHttpStatusCode; 135 private final int mHttpStatusCode;
116 private final String mHttpStatusText; 136 private final String mHttpStatusText;
117 private final HeadersList mAllHeaders = new HeadersList(); 137 private final HeadersList mAllHeaders = new HeadersList();
118 private final boolean mWasCached; 138 private final boolean mWasCached;
119 private final String mNegotiatedProtocol; 139 private final String mNegotiatedProtocol;
140 private Map<String, List<String>> mResponseHeaders;
120 141
121 NativeResponseInfo(String[] urlChain, int httpStatusCode, 142 NativeResponseInfo(String[] urlChain, int httpStatusCode,
122 String httpStatusText, boolean wasCached, 143 String httpStatusText, boolean wasCached,
123 String negotiatedProtocol) { 144 String negotiatedProtocol) {
124 mResponseInfoUrlChain = urlChain; 145 mResponseInfoUrlChain = urlChain;
125 mHttpStatusCode = httpStatusCode; 146 mHttpStatusCode = httpStatusCode;
126 mHttpStatusText = httpStatusText; 147 mHttpStatusText = httpStatusText;
127 mWasCached = wasCached; 148 mWasCached = wasCached;
128 mNegotiatedProtocol = negotiatedProtocol; 149 mNegotiatedProtocol = negotiatedProtocol;
129 } 150 }
(...skipping 18 matching lines...) Expand all
148 return mHttpStatusText; 169 return mHttpStatusText;
149 } 170 }
150 171
151 @Override 172 @Override
152 public List<Pair<String, String>> getAllHeadersAsList() { 173 public List<Pair<String, String>> getAllHeadersAsList() {
153 return Collections.unmodifiableList(mAllHeaders); 174 return Collections.unmodifiableList(mAllHeaders);
154 } 175 }
155 176
156 @Override 177 @Override
157 public Map<String, List<String>> getAllHeaders() { 178 public Map<String, List<String>> getAllHeaders() {
158 Map<String, List<String>> map = new HashMap<String, List<String>>(); 179 if (mResponseHeaders != null) {
180 return mResponseHeaders;
181 }
182 Map<String, List<String>> map =
183 new TreeMap<String, List<String>>(FIELD_NAME_COMPARATOR);
mmenke 2015/01/16 19:43:13 Hrm...The comparison is not "consistent with equal
xunjieli 2015/01/16 20:01:12 Acknowledged.
159 for (Pair<String, String> entry : mAllHeaders) { 184 for (Pair<String, String> entry : mAllHeaders) {
185 List<String> values = new ArrayList<String>();
160 if (map.containsKey(entry.first)) { 186 if (map.containsKey(entry.first)) {
161 map.get(entry.first).add(entry.second); 187 values.addAll(map.get(entry.first));
162 } else {
163 List<String> values = new ArrayList<String>();
164 values.add(entry.second);
165 map.put(entry.first, values);
166 } 188 }
189 values.add(entry.second);
190 map.put(entry.first, Collections.unmodifiableList(values));
167 } 191 }
168 return Collections.unmodifiableMap(map); 192 mResponseHeaders = Collections.unmodifiableMap(map);
193 return mResponseHeaders;
169 } 194 }
170 195
171 @Override 196 @Override
172 public boolean wasCached() { 197 public boolean wasCached() {
173 return mWasCached; 198 return mWasCached;
174 } 199 }
175 200
176 @Override 201 @Override
177 public String getNegotiatedProtocol() { 202 public String getNegotiatedProtocol() {
178 return mNegotiatedProtocol; 203 return mNegotiatedProtocol;
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 HeadersList headers); 629 HeadersList headers);
605 630
606 private native String nativeGetNegotiatedProtocol(long urlRequestAdapter); 631 private native String nativeGetNegotiatedProtocol(long urlRequestAdapter);
607 632
608 private native String nativeGetHttpStatusText(long urlRequestAdapter); 633 private native String nativeGetHttpStatusText(long urlRequestAdapter);
609 634
610 private native boolean nativeGetWasCached(long urlRequestAdapter); 635 private native boolean nativeGetWasCached(long urlRequestAdapter);
611 636
612 private native long nativeGetTotalReceivedBytes(long urlRequestAdapter); 637 private native long nativeGetTotalReceivedBytes(long urlRequestAdapter);
613 } 638 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698