| 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 final UrlRequest.Builder mRequestBuilder; |
| 42 private UrlRequest mRequest; |
| 42 private final List<Pair<String, String>> mRequestHeaders; | 43 private final List<Pair<String, String>> mRequestHeaders; |
| 43 | 44 |
| 44 private CronetInputStream mInputStream; | 45 private CronetInputStream mInputStream; |
| 45 private CronetOutputStream mOutputStream; | 46 private CronetOutputStream mOutputStream; |
| 46 private ResponseInfo mResponseInfo; | 47 private ResponseInfo mResponseInfo; |
| 47 private UrlRequestException mException; | 48 private UrlRequestException mException; |
| 48 private boolean mOnRedirectCalled = false; | 49 private boolean mOnRedirectCalled = false; |
| 49 private boolean mHasResponse = false; | 50 private boolean mHasResponse = false; |
| 50 | 51 |
| 51 public CronetHttpURLConnection(URL url, | 52 public CronetHttpURLConnection(URL url, CronetEngine cronetEngine) { |
| 52 UrlRequestContext urlRequestContext) { | |
| 53 super(url); | 53 super(url); |
| 54 mUrlRequestContext = urlRequestContext; | 54 mCronetEngine = cronetEngine; |
| 55 mMessageLoop = new MessageLoop(); | 55 mMessageLoop = new MessageLoop(); |
| 56 mRequest = mUrlRequestContext.createRequest(url.toString(), | 56 mRequestBuilder = new UrlRequest.Builder( |
| 57 new CronetUrlRequestListener(), mMessageLoop); | 57 url.toString(), new CronetUrlRequestListener(), mMessageLoop); |
| 58 mInputStream = new CronetInputStream(this); | 58 mInputStream = new CronetInputStream(this); |
| 59 mRequestHeaders = new ArrayList<Pair<String, String>>(); | 59 mRequestHeaders = new ArrayList<Pair<String, String>>(); |
| 60 } | 60 } |
| 61 | 61 |
| 62 /** | 62 /** |
| 63 * Opens a connection to the resource. If the connect method is called when | 63 * 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 | 64 * the connection has already been opened (indicated by the connected field |
| 65 * having the value {@code true}), the call is ignored. | 65 * having the value {@code true}), the call is ignored. |
| 66 */ | 66 */ |
| 67 @Override | 67 @Override |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 | 250 |
| 251 /** | 251 /** |
| 252 * Starts the request if {@code connected} is false. | 252 * Starts the request if {@code connected} is false. |
| 253 */ | 253 */ |
| 254 private void startRequest() throws IOException { | 254 private void startRequest() throws IOException { |
| 255 if (connected) { | 255 if (connected) { |
| 256 return; | 256 return; |
| 257 } | 257 } |
| 258 if (doOutput) { | 258 if (doOutput) { |
| 259 if (mOutputStream != null) { | 259 if (mOutputStream != null) { |
| 260 mRequest.setUploadDataProvider(mOutputStream.getUploadDataProvid
er(), mMessageLoop); | 260 mRequestBuilder.setUploadDataProvider( |
| 261 mOutputStream.getUploadDataProvider(), mMessageLoop); |
| 261 if (getRequestProperty(CONTENT_LENGTH) == null && !isChunkedUplo
ad()) { | 262 if (getRequestProperty(CONTENT_LENGTH) == null && !isChunkedUplo
ad()) { |
| 262 addRequestProperty(CONTENT_LENGTH, | 263 addRequestProperty(CONTENT_LENGTH, |
| 263 Long.toString(mOutputStream.getUploadDataProvider().
getLength())); | 264 Long.toString(mOutputStream.getUploadDataProvider().
getLength())); |
| 264 } | 265 } |
| 265 // Tells mOutputStream that startRequest() has been called, so | 266 // Tells mOutputStream that startRequest() has been called, so |
| 266 // the underlying implementation can prepare for reading if need
ed. | 267 // the underlying implementation can prepare for reading if need
ed. |
| 267 mOutputStream.setConnected(); | 268 mOutputStream.setConnected(); |
| 268 } else { | 269 } else { |
| 269 if (getRequestProperty(CONTENT_LENGTH) == null) { | 270 if (getRequestProperty(CONTENT_LENGTH) == null) { |
| 270 addRequestProperty(CONTENT_LENGTH, "0"); | 271 addRequestProperty(CONTENT_LENGTH, "0"); |
| 271 } | 272 } |
| 272 } | 273 } |
| 273 // Default Content-Type to application/x-www-form-urlencoded | 274 // Default Content-Type to application/x-www-form-urlencoded |
| 274 if (getRequestProperty("Content-Type") == null) { | 275 if (getRequestProperty("Content-Type") == null) { |
| 275 addRequestProperty("Content-Type", | 276 addRequestProperty("Content-Type", |
| 276 "application/x-www-form-urlencoded"); | 277 "application/x-www-form-urlencoded"); |
| 277 } | 278 } |
| 278 } | 279 } |
| 279 for (Pair<String, String> requestHeader : mRequestHeaders) { | 280 for (Pair<String, String> requestHeader : mRequestHeaders) { |
| 280 mRequest.addHeader(requestHeader.first, requestHeader.second); | 281 mRequestBuilder.addHeader(requestHeader.first, requestHeader.second)
; |
| 281 } | 282 } |
| 282 if (!getUseCaches()) { | 283 if (!getUseCaches()) { |
| 283 mRequest.disableCache(); | 284 mRequestBuilder.disableCache(); |
| 284 } | 285 } |
| 285 connected = true; | 286 connected = true; |
| 286 // Start the request. | 287 // Start the request. |
| 287 mRequest.start(); | 288 mRequest = mCronetEngine.executeRequest(mRequestBuilder); |
| 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() { |
| 296 try { | 297 try { |
| 297 getResponse(); | 298 getResponse(); |
| (...skipping 238 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 |