Chromium Code Reviews| OLD | NEW |
|---|---|
| 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.urlconnection; | 5 package org.chromium.net.urlconnection; |
| 6 | 6 |
| 7 import org.chromium.net.ExtendedResponseInfo; | 7 import org.chromium.net.ExtendedResponseInfo; |
| 8 import org.chromium.net.ResponseInfo; | 8 import org.chromium.net.ResponseInfo; |
| 9 import org.chromium.net.UrlRequest; | 9 import org.chromium.net.UrlRequest; |
| 10 import org.chromium.net.UrlRequestContext; | 10 import org.chromium.net.UrlRequestContext; |
| 11 import org.chromium.net.UrlRequestException; | 11 import org.chromium.net.UrlRequestException; |
| 12 import org.chromium.net.UrlRequestListener; | 12 import org.chromium.net.UrlRequestListener; |
| 13 | 13 |
| 14 import java.io.IOException; | 14 import java.io.IOException; |
| 15 import java.io.InputStream; | 15 import java.io.InputStream; |
| 16 import java.net.HttpURLConnection; | 16 import java.net.HttpURLConnection; |
| 17 import java.net.MalformedURLException; | |
| 17 import java.net.URL; | 18 import java.net.URL; |
| 18 import java.nio.ByteBuffer; | 19 import java.nio.ByteBuffer; |
| 19 | 20 |
| 20 /** | 21 /** |
| 21 * An implementation of HttpURLConnection that uses Cronet to send requests and | 22 * An implementation of HttpURLConnection that uses Cronet to send requests and |
| 22 * receive response. This class inherits a {@code connected} field from the | 23 * receive response. This class inherits a {@code connected} field from the |
| 23 * superclass. That field indicates whether a connection has ever been | 24 * superclass. That field indicates whether a connection has ever been |
| 24 * attempted. | 25 * attempted. |
| 25 */ | 26 */ |
| 26 public class CronetHttpURLConnection extends HttpURLConnection { | 27 public class CronetHttpURLConnection extends HttpURLConnection { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 100 return mResponseInfo.getHttpStatusCode(); | 101 return mResponseInfo.getHttpStatusCode(); |
| 101 } | 102 } |
| 102 | 103 |
| 103 /** | 104 /** |
| 104 * Returns an InputStream for reading data from the resource pointed by this | 105 * Returns an InputStream for reading data from the resource pointed by this |
| 105 * URLConnection. | 106 * URLConnection. |
| 106 */ | 107 */ |
| 107 @Override | 108 @Override |
| 108 public InputStream getInputStream() throws IOException { | 109 public InputStream getInputStream() throws IOException { |
| 109 connect(); | 110 connect(); |
| 111 if (mResponseInfo == null) { | |
| 112 throw new IOException(); | |
| 113 } | |
| 114 if (!instanceFollowRedirects | |
| 115 && mResponseInfo.getHttpStatusCode() == 302) { | |
|
mmenke
2014/12/10 21:44:52
301, 303, 307, and 308 may also be redirects (308s
xunjieli
2014/12/12 20:58:02
Done. Smart idea! thanks
| |
| 116 throw new IOException( | |
| 117 "Cannot read response body of a 302 response"); | |
| 118 } | |
| 110 return mInputStream; | 119 return mInputStream; |
| 111 } | 120 } |
| 112 | 121 |
| 113 /** | 122 /** |
| 114 * Adds the given property to the request header. | 123 * Adds the given property to the request header. |
| 115 */ | 124 */ |
| 116 @Override | 125 @Override |
| 117 public final void addRequestProperty(String key, String value) { | 126 public final void addRequestProperty(String key, String value) { |
| 118 // Note that Cronet right now does not allow setting multiple headers | 127 // Note that Cronet right now does not allow setting multiple headers |
| 119 // of the same key, see crbug.com/432719 for more details. | 128 // of the same key, see crbug.com/432719 for more details. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 169 mResponseInfo = info; | 178 mResponseInfo = info; |
| 170 mResponseByteBuffer = ByteBuffer.allocate(byteBuffer.capacity()); | 179 mResponseByteBuffer = ByteBuffer.allocate(byteBuffer.capacity()); |
| 171 mResponseByteBuffer.put(byteBuffer); | 180 mResponseByteBuffer.put(byteBuffer); |
| 172 mResponseByteBuffer.flip(); | 181 mResponseByteBuffer.flip(); |
| 173 mMessageLoop.postQuitTask(); | 182 mMessageLoop.postQuitTask(); |
| 174 } | 183 } |
| 175 | 184 |
| 176 @Override | 185 @Override |
| 177 public void onRedirect(UrlRequest request, ResponseInfo info, | 186 public void onRedirect(UrlRequest request, ResponseInfo info, |
| 178 String newLocationUrl) { | 187 String newLocationUrl) { |
| 179 // TODO(xunjieli): Handle redirect and test it. | 188 if (instanceFollowRedirects) { |
| 189 try { | |
| 190 url = new URL(newLocationUrl); | |
| 191 } catch (MalformedURLException e) { | |
|
xunjieli
2014/12/10 20:27:17
Not sure if we need to handle malformed url, I gue
mef
2014/12/11 16:30:56
I agree.
xunjieli
2014/12/12 20:58:02
Acknowledged. I will leave it unhandled, unless Ma
| |
| 192 // Ignored. | |
| 193 } | |
| 194 } else { | |
| 195 mResponseInfo = info; | |
| 196 mRequest.cancel(); | |
| 197 setResponseDataCompleted(); | |
|
mef
2014/12/11 16:30:56
Per Matt's suggestion maybe set a flag indicating
xunjieli
2014/12/12 20:58:01
Done.
| |
| 198 } | |
| 180 } | 199 } |
| 181 | 200 |
| 182 @Override | 201 @Override |
| 183 public void onSucceeded(UrlRequest request, ExtendedResponseInfo info) { | 202 public void onSucceeded(UrlRequest request, ExtendedResponseInfo info) { |
| 184 mResponseInfo = info.getResponseInfo(); | 203 mResponseInfo = info.getResponseInfo(); |
| 185 setResponseDataCompleted(); | 204 setResponseDataCompleted(); |
| 186 } | 205 } |
| 187 | 206 |
| 188 @Override | 207 @Override |
| 189 public void onFailed(UrlRequest request, ResponseInfo info, | 208 public void onFailed(UrlRequest request, ResponseInfo info, |
| 190 UrlRequestException exception) { | 209 UrlRequestException exception) { |
| 191 // TODO(xunjieli): Handle failure. | 210 // TODO(xunjieli): Handle failure. |
| 192 setResponseDataCompleted(); | 211 setResponseDataCompleted(); |
| 193 } | 212 } |
| 194 | 213 |
| 195 /** | 214 /** |
| 196 * Notifies {@link #mInputStream} that transferring of response data has | 215 * Notifies {@link #mInputStream} that transferring of response data has |
| 197 * completed. | 216 * completed. |
| 198 */ | 217 */ |
| 199 private void setResponseDataCompleted() { | 218 private void setResponseDataCompleted() { |
| 200 if (mInputStream != null) { | 219 if (mInputStream != null) { |
| 201 mInputStream.setResponseDataCompleted(); | 220 mInputStream.setResponseDataCompleted(); |
| 202 } | 221 } |
| 203 mMessageLoop.postQuitTask(); | 222 mMessageLoop.postQuitTask(); |
| 204 } | 223 } |
| 205 } | 224 } |
| 206 } | 225 } |
| OLD | NEW |