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 android.util.Pair; | 7 import android.util.Pair; |
8 | 8 |
9 import org.chromium.base.Log; | 9 import org.chromium.base.Log; |
| 10 import org.chromium.net.CronetEngine; |
10 import org.chromium.net.ExtendedResponseInfo; | 11 import org.chromium.net.ExtendedResponseInfo; |
11 import org.chromium.net.ResponseInfo; | 12 import org.chromium.net.ResponseInfo; |
12 import org.chromium.net.UrlRequest; | 13 import org.chromium.net.UrlRequest; |
13 import org.chromium.net.UrlRequestContext; | |
14 import org.chromium.net.UrlRequestException; | 14 import org.chromium.net.UrlRequestException; |
15 import org.chromium.net.UrlRequestListener; | 15 import org.chromium.net.UrlRequestListener; |
16 | 16 |
17 import java.io.FileNotFoundException; | 17 import java.io.FileNotFoundException; |
18 import java.io.IOException; | 18 import java.io.IOException; |
19 import java.io.InputStream; | 19 import java.io.InputStream; |
20 import java.io.OutputStream; | 20 import java.io.OutputStream; |
21 import java.net.HttpURLConnection; | 21 import java.net.HttpURLConnection; |
22 import java.net.MalformedURLException; | 22 import java.net.MalformedURLException; |
23 import java.net.ProtocolException; | 23 import java.net.ProtocolException; |
24 import java.net.URL; | 24 import java.net.URL; |
25 import java.nio.ByteBuffer; | 25 import java.nio.ByteBuffer; |
26 import java.util.ArrayList; | 26 import java.util.ArrayList; |
27 import java.util.Collections; | 27 import java.util.Collections; |
28 import java.util.List; | 28 import java.util.List; |
29 import java.util.Map; | 29 import java.util.Map; |
30 import java.util.TreeMap; | 30 import java.util.TreeMap; |
31 | 31 |
32 /** | 32 /** |
33 * An implementation of {@link HttpURLConnection} that uses Cronet to send | 33 * An implementation of {@link HttpURLConnection} that uses Cronet to send |
34 * requests and receive responses. | 34 * requests and receive responses. |
35 */ | 35 */ |
36 class CronetHttpURLConnection extends HttpURLConnection { | 36 class CronetHttpURLConnection extends HttpURLConnection { |
37 private static final String TAG = "cr.CronetHttpURLConn"; | 37 private static final String TAG = "cr.CronetHttpURLConn"; |
38 private static final String CONTENT_LENGTH = "Content-Length"; | 38 private static final String CONTENT_LENGTH = "Content-Length"; |
39 private final UrlRequestContext mUrlRequestContext; | 39 private final CronetEngine mCronetEngine; |
40 private final MessageLoop mMessageLoop; | 40 private final MessageLoop mMessageLoop; |
41 private final UrlRequest mRequest; | 41 private UrlRequest mRequest; |
42 private final List<Pair<String, String>> mRequestHeaders; | 42 private final List<Pair<String, String>> mRequestHeaders; |
43 | 43 |
44 private CronetInputStream mInputStream; | 44 private CronetInputStream mInputStream; |
45 private CronetOutputStream mOutputStream; | 45 private CronetOutputStream mOutputStream; |
46 private ResponseInfo mResponseInfo; | 46 private ResponseInfo mResponseInfo; |
47 private UrlRequestException mException; | 47 private UrlRequestException mException; |
48 private boolean mOnRedirectCalled = false; | 48 private boolean mOnRedirectCalled = false; |
49 private boolean mHasResponse = false; | 49 private boolean mHasResponse = false; |
50 | 50 |
51 public CronetHttpURLConnection(URL url, | 51 public CronetHttpURLConnection(URL url, CronetEngine cronetEngine) { |
52 UrlRequestContext urlRequestContext) { | |
53 super(url); | 52 super(url); |
54 mUrlRequestContext = urlRequestContext; | 53 mCronetEngine = cronetEngine; |
55 mMessageLoop = new MessageLoop(); | 54 mMessageLoop = new MessageLoop(); |
56 mRequest = mUrlRequestContext.createRequest(url.toString(), | |
57 new CronetUrlRequestListener(), mMessageLoop); | |
58 mInputStream = new CronetInputStream(this); | 55 mInputStream = new CronetInputStream(this); |
59 mRequestHeaders = new ArrayList<Pair<String, String>>(); | 56 mRequestHeaders = new ArrayList<Pair<String, String>>(); |
60 } | 57 } |
61 | 58 |
62 /** | 59 /** |
63 * Opens a connection to the resource. If the connect method is called when | 60 * Opens a connection to the resource. If the connect method is called when |
64 * the connection has already been opened (indicated by the connected field | 61 * the connection has already been opened (indicated by the connected field |
65 * having the value {@code true}), the call is ignored. | 62 * having the value {@code true}), the call is ignored. |
66 */ | 63 */ |
67 @Override | 64 @Override |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 return contentLength; | 245 return contentLength; |
249 } | 246 } |
250 | 247 |
251 /** | 248 /** |
252 * Starts the request if {@code connected} is false. | 249 * Starts the request if {@code connected} is false. |
253 */ | 250 */ |
254 private void startRequest() throws IOException { | 251 private void startRequest() throws IOException { |
255 if (connected) { | 252 if (connected) { |
256 return; | 253 return; |
257 } | 254 } |
| 255 final UrlRequest.Builder requestBuilder = new UrlRequest.Builder( |
| 256 getURL().toString(), new CronetUrlRequestListener(), mMessageLoo
p, mCronetEngine); |
258 if (doOutput) { | 257 if (doOutput) { |
259 if (mOutputStream != null) { | 258 if (mOutputStream != null) { |
260 mRequest.setUploadDataProvider(mOutputStream.getUploadDataProvid
er(), mMessageLoop); | 259 requestBuilder.setUploadDataProvider( |
| 260 mOutputStream.getUploadDataProvider(), mMessageLoop); |
261 if (getRequestProperty(CONTENT_LENGTH) == null && !isChunkedUplo
ad()) { | 261 if (getRequestProperty(CONTENT_LENGTH) == null && !isChunkedUplo
ad()) { |
262 addRequestProperty(CONTENT_LENGTH, | 262 addRequestProperty(CONTENT_LENGTH, |
263 Long.toString(mOutputStream.getUploadDataProvider().
getLength())); | 263 Long.toString(mOutputStream.getUploadDataProvider().
getLength())); |
264 } | 264 } |
265 // Tells mOutputStream that startRequest() has been called, so | 265 // Tells mOutputStream that startRequest() has been called, so |
266 // the underlying implementation can prepare for reading if need
ed. | 266 // the underlying implementation can prepare for reading if need
ed. |
267 mOutputStream.setConnected(); | 267 mOutputStream.setConnected(); |
268 } else { | 268 } else { |
269 if (getRequestProperty(CONTENT_LENGTH) == null) { | 269 if (getRequestProperty(CONTENT_LENGTH) == null) { |
270 addRequestProperty(CONTENT_LENGTH, "0"); | 270 addRequestProperty(CONTENT_LENGTH, "0"); |
271 } | 271 } |
272 } | 272 } |
273 // Default Content-Type to application/x-www-form-urlencoded | 273 // Default Content-Type to application/x-www-form-urlencoded |
274 if (getRequestProperty("Content-Type") == null) { | 274 if (getRequestProperty("Content-Type") == null) { |
275 addRequestProperty("Content-Type", | 275 addRequestProperty("Content-Type", |
276 "application/x-www-form-urlencoded"); | 276 "application/x-www-form-urlencoded"); |
277 } | 277 } |
278 } | 278 } |
279 for (Pair<String, String> requestHeader : mRequestHeaders) { | 279 for (Pair<String, String> requestHeader : mRequestHeaders) { |
280 mRequest.addHeader(requestHeader.first, requestHeader.second); | 280 requestBuilder.addHeader(requestHeader.first, requestHeader.second); |
281 } | 281 } |
282 if (!getUseCaches()) { | 282 if (!getUseCaches()) { |
283 mRequest.disableCache(); | 283 requestBuilder.disableCache(); |
284 } | 284 } |
285 connected = true; | 285 connected = true; |
| 286 mRequest = requestBuilder.build(); |
286 // Start the request. | 287 // Start the request. |
287 mRequest.start(); | 288 mRequest.start(); |
288 } | 289 } |
289 | 290 |
290 /** | 291 /** |
291 * Returns an input stream from the server in the case of an error such as | 292 * Returns an input stream from the server in the case of an error such as |
292 * the requested file has not been found on the remote server. | 293 * the requested file has not been found on the remote server. |
293 */ | 294 */ |
294 @Override | 295 @Override |
295 public InputStream getErrorStream() { | 296 public InputStream getErrorStream() { |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 } | 537 } |
537 | 538 |
538 /** | 539 /** |
539 * Returns whether the client has used {@link #setChunkedStreamingMode} to | 540 * Returns whether the client has used {@link #setChunkedStreamingMode} to |
540 * set chunked encoding for upload. | 541 * set chunked encoding for upload. |
541 */ | 542 */ |
542 private boolean isChunkedUpload() { | 543 private boolean isChunkedUpload() { |
543 return chunkLength > 0; | 544 return chunkLength > 0; |
544 } | 545 } |
545 } | 546 } |
OLD | NEW |