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

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

Issue 790273002: [Cronet] Handle redirects in CronetHttpURLConnection (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Modified a comment Created 6 years 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
« no previous file with comments | « no previous file | components/cronet/android/test/assets/test/multiredirect.html.mock-http-headers » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.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 {
27 private final UrlRequestContext mUrlRequestContext; 28 private final UrlRequestContext mUrlRequestContext;
28 private final MessageLoop mMessageLoop; 29 private final MessageLoop mMessageLoop;
29 private final UrlRequest mRequest; 30 private final UrlRequest mRequest;
30 31
31 private CronetInputStream mInputStream; 32 private CronetInputStream mInputStream;
32 private ResponseInfo mResponseInfo; 33 private ResponseInfo mResponseInfo;
33 private ByteBuffer mResponseByteBuffer; 34 private ByteBuffer mResponseByteBuffer;
35 private boolean mOnRedirectCalled = false;
34 36
35 protected CronetHttpURLConnection(URL url, 37 protected CronetHttpURLConnection(URL url,
36 UrlRequestContext urlRequestContext) { 38 UrlRequestContext urlRequestContext) {
37 super(url); 39 super(url);
38 mUrlRequestContext = urlRequestContext; 40 mUrlRequestContext = urlRequestContext;
39 mMessageLoop = new MessageLoop(); 41 mMessageLoop = new MessageLoop();
40 mRequest = mUrlRequestContext.createRequest(url.toString(), 42 mRequest = mUrlRequestContext.createRequest(url.toString(),
41 new CronetUrlRequestListener(), mMessageLoop); 43 new CronetUrlRequestListener(), mMessageLoop);
42 mInputStream = new CronetInputStream(this); 44 mInputStream = new CronetInputStream(this);
43 } 45 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 return mResponseInfo.getHttpStatusCode(); 102 return mResponseInfo.getHttpStatusCode();
101 } 103 }
102 104
103 /** 105 /**
104 * Returns an InputStream for reading data from the resource pointed by this 106 * Returns an InputStream for reading data from the resource pointed by this
105 * URLConnection. 107 * URLConnection.
106 */ 108 */
107 @Override 109 @Override
108 public InputStream getInputStream() throws IOException { 110 public InputStream getInputStream() throws IOException {
109 connect(); 111 connect();
112 if (mResponseInfo == null) {
113 throw new IOException();
114 }
115 if (!instanceFollowRedirects && mOnRedirectCalled) {
116 throw new IOException("Cannot read response body of a redirect.");
117 }
110 return mInputStream; 118 return mInputStream;
111 } 119 }
112 120
113 /** 121 /**
114 * Adds the given property to the request header. 122 * Adds the given property to the request header.
115 */ 123 */
116 @Override 124 @Override
117 public final void addRequestProperty(String key, String value) { 125 public final void addRequestProperty(String key, String value) {
118 // Note that Cronet right now does not allow setting multiple headers 126 // Note that Cronet right now does not allow setting multiple headers
119 // of the same key, see crbug.com/432719 for more details. 127 // of the same key, see crbug.com/432719 for more details.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 mResponseInfo = info; 177 mResponseInfo = info;
170 mResponseByteBuffer = ByteBuffer.allocate(byteBuffer.capacity()); 178 mResponseByteBuffer = ByteBuffer.allocate(byteBuffer.capacity());
171 mResponseByteBuffer.put(byteBuffer); 179 mResponseByteBuffer.put(byteBuffer);
172 mResponseByteBuffer.flip(); 180 mResponseByteBuffer.flip();
173 mMessageLoop.postQuitTask(); 181 mMessageLoop.postQuitTask();
174 } 182 }
175 183
176 @Override 184 @Override
177 public void onRedirect(UrlRequest request, ResponseInfo info, 185 public void onRedirect(UrlRequest request, ResponseInfo info,
178 String newLocationUrl) { 186 String newLocationUrl) {
179 // TODO(xunjieli): Handle redirect and test it. 187 mOnRedirectCalled = true;
188 if (instanceFollowRedirects) {
189 try {
190 url = new URL(newLocationUrl);
191 } catch (MalformedURLException e) {
192 // Ignored.
193 }
194 } else {
195 mResponseInfo = info;
196 mRequest.cancel();
197 setResponseDataCompleted();
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 }
OLDNEW
« no previous file with comments | « no previous file | components/cronet/android/test/assets/test/multiredirect.html.mock-http-headers » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698