| Index: components/cronet/android/api/src/org/chromium/net/HttpUrlConnectionUrlRequest.java
|
| diff --git a/components/cronet/android/api/src/org/chromium/net/HttpUrlConnectionUrlRequest.java b/components/cronet/android/api/src/org/chromium/net/HttpUrlConnectionUrlRequest.java
|
| deleted file mode 100644
|
| index da092933716cfd3ed0d1ec33cb95b4c8d09cead9..0000000000000000000000000000000000000000
|
| --- a/components/cronet/android/api/src/org/chromium/net/HttpUrlConnectionUrlRequest.java
|
| +++ /dev/null
|
| @@ -1,530 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -package org.chromium.net;
|
| -
|
| -import android.content.Context;
|
| -import android.text.TextUtils;
|
| -
|
| -import java.io.FileNotFoundException;
|
| -import java.io.IOException;
|
| -import java.io.InputStream;
|
| -import java.io.OutputStream;
|
| -import java.net.HttpURLConnection;
|
| -import java.net.ProtocolException;
|
| -import java.net.URL;
|
| -import java.nio.ByteBuffer;
|
| -import java.nio.channels.ReadableByteChannel;
|
| -import java.nio.channels.WritableByteChannel;
|
| -import java.util.List;
|
| -import java.util.Map;
|
| -import java.util.Map.Entry;
|
| -import java.util.concurrent.ExecutorService;
|
| -import java.util.concurrent.Executors;
|
| -import java.util.concurrent.ThreadFactory;
|
| -import java.util.concurrent.atomic.AtomicInteger;
|
| -import java.util.zip.GZIPInputStream;
|
| -
|
| -/**
|
| - * Network request using the HttpUrlConnection implementation.
|
| - * @deprecated Use {@link UrlRequest} instead.
|
| - * {@hide as it's deprecated}
|
| - */
|
| -@Deprecated
|
| -class HttpUrlConnectionUrlRequest implements HttpUrlRequest {
|
| -
|
| - private static final int MAX_CHUNK_SIZE = 8192;
|
| -
|
| - private static final int CONNECT_TIMEOUT = 3000;
|
| -
|
| - private static final int READ_TIMEOUT = 90000;
|
| -
|
| - private final Context mContext;
|
| -
|
| - private final String mDefaultUserAgent;
|
| -
|
| - private final String mUrl;
|
| -
|
| - private final Map<String, String> mHeaders;
|
| -
|
| - private final WritableByteChannel mSink;
|
| -
|
| - private final HttpUrlRequestListener mListener;
|
| -
|
| - private IOException mException;
|
| -
|
| - private HttpURLConnection mConnection;
|
| -
|
| - private long mOffset;
|
| -
|
| - private int mContentLength;
|
| -
|
| - private int mUploadContentLength;
|
| -
|
| - private long mContentLengthLimit;
|
| -
|
| - private boolean mCancelIfContentLengthOverLimit;
|
| -
|
| - private boolean mContentLengthOverLimit;
|
| -
|
| - private boolean mSkippingToOffset;
|
| -
|
| - private long mSize;
|
| -
|
| - private String mPostContentType;
|
| -
|
| - private byte[] mPostData;
|
| -
|
| - private ReadableByteChannel mPostDataChannel;
|
| -
|
| - private String mContentType;
|
| -
|
| - private int mHttpStatusCode;
|
| -
|
| - private String mHttpStatusText;
|
| -
|
| - private boolean mStarted;
|
| -
|
| - private boolean mCanceled;
|
| -
|
| - private String mMethod;
|
| -
|
| - private InputStream mResponseStream;
|
| -
|
| - private final Object mLock;
|
| -
|
| - private static ExecutorService sExecutorService;
|
| -
|
| - private static final Object sExecutorServiceLock = new Object();
|
| -
|
| - HttpUrlConnectionUrlRequest(Context context, String defaultUserAgent,
|
| - String url, int requestPriority, Map<String, String> headers,
|
| - HttpUrlRequestListener listener) {
|
| - this(context, defaultUserAgent, url, requestPriority, headers,
|
| - new ChunkedWritableByteChannel(), listener);
|
| - }
|
| -
|
| - HttpUrlConnectionUrlRequest(Context context, String defaultUserAgent,
|
| - String url, int requestPriority, Map<String, String> headers,
|
| - WritableByteChannel sink, HttpUrlRequestListener listener) {
|
| - if (context == null) {
|
| - throw new NullPointerException("Context is required");
|
| - }
|
| - if (url == null) {
|
| - throw new NullPointerException("URL is required");
|
| - }
|
| - mContext = context;
|
| - mDefaultUserAgent = defaultUserAgent;
|
| - mUrl = url;
|
| - mHeaders = headers;
|
| - mSink = sink;
|
| - mListener = listener;
|
| - mLock = new Object();
|
| - }
|
| -
|
| - private static ExecutorService getExecutor() {
|
| - synchronized (sExecutorServiceLock) {
|
| - if (sExecutorService == null) {
|
| - ThreadFactory threadFactory = new ThreadFactory() {
|
| - private final AtomicInteger mCount = new AtomicInteger(1);
|
| -
|
| - @Override
|
| - public Thread newThread(Runnable r) {
|
| - Thread thread = new Thread(r,
|
| - "HttpUrlConnection #"
|
| - + mCount.getAndIncrement());
|
| - // Note that this thread is not doing actual networking.
|
| - // It's only a controller.
|
| - thread.setPriority(Thread.NORM_PRIORITY);
|
| - return thread;
|
| - }
|
| - };
|
| - sExecutorService = Executors.newCachedThreadPool(threadFactory);
|
| - }
|
| - return sExecutorService;
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public String getUrl() {
|
| - return mUrl;
|
| - }
|
| -
|
| - @Override
|
| - public void setOffset(long offset) {
|
| - mOffset = offset;
|
| - }
|
| -
|
| - @Override
|
| - public void setContentLengthLimit(long limit, boolean cancelEarly) {
|
| - mContentLengthLimit = limit;
|
| - mCancelIfContentLengthOverLimit = cancelEarly;
|
| - }
|
| -
|
| - @Override
|
| - public void setUploadData(String contentType, byte[] data) {
|
| - validateNotStarted();
|
| - mPostContentType = contentType;
|
| - mPostData = data;
|
| - mPostDataChannel = null;
|
| - }
|
| -
|
| - @Override
|
| - public void setUploadChannel(String contentType,
|
| - ReadableByteChannel channel, long contentLength) {
|
| - validateNotStarted();
|
| - if (contentLength > Integer.MAX_VALUE) {
|
| - throw new IllegalArgumentException(
|
| - "Upload contentLength is too big.");
|
| - }
|
| - mUploadContentLength = (int) contentLength;
|
| - mPostContentType = contentType;
|
| - mPostDataChannel = channel;
|
| - mPostData = null;
|
| - }
|
| -
|
| -
|
| - @Override
|
| - public void setHttpMethod(String method) {
|
| - validateNotStarted();
|
| - mMethod = method;
|
| - }
|
| -
|
| - @Override
|
| - public void disableRedirects() {
|
| - validateNotStarted();
|
| - HttpURLConnection.setFollowRedirects(false);
|
| - }
|
| -
|
| - @Override
|
| - public void start() {
|
| - getExecutor().execute(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - startOnExecutorThread();
|
| - }
|
| - });
|
| - }
|
| -
|
| - private void startOnExecutorThread() {
|
| - boolean readingResponse = false;
|
| - try {
|
| - synchronized (mLock) {
|
| - if (mCanceled) {
|
| - return;
|
| - }
|
| - }
|
| -
|
| - URL url = new URL(mUrl);
|
| - mConnection = (HttpURLConnection) url.openConnection();
|
| - // If configured, use the provided http verb.
|
| - if (mMethod != null) {
|
| - try {
|
| - mConnection.setRequestMethod(mMethod);
|
| - } catch (ProtocolException e) {
|
| - // Since request hasn't started earlier, it
|
| - // must be an illegal HTTP verb.
|
| - throw new IllegalArgumentException(e);
|
| - }
|
| - }
|
| - mConnection.setConnectTimeout(CONNECT_TIMEOUT);
|
| - mConnection.setReadTimeout(READ_TIMEOUT);
|
| - mConnection.setInstanceFollowRedirects(true);
|
| - if (mHeaders != null) {
|
| - for (Entry<String, String> header : mHeaders.entrySet()) {
|
| - mConnection.setRequestProperty(header.getKey(),
|
| - header.getValue());
|
| - }
|
| - }
|
| -
|
| - if (mOffset != 0) {
|
| - mConnection.setRequestProperty("Range",
|
| - "bytes=" + mOffset + "-");
|
| - }
|
| -
|
| - if (mConnection.getRequestProperty("User-Agent") == null) {
|
| - mConnection.setRequestProperty("User-Agent", mDefaultUserAgent);
|
| - }
|
| -
|
| - if (mPostData != null || mPostDataChannel != null) {
|
| - uploadData();
|
| - }
|
| -
|
| - InputStream stream = null;
|
| - try {
|
| - // We need to open the stream before asking for the response
|
| - // code.
|
| - stream = mConnection.getInputStream();
|
| - } catch (FileNotFoundException ex) {
|
| - // Ignore - the response has no body.
|
| - }
|
| -
|
| - mHttpStatusCode = mConnection.getResponseCode();
|
| - mHttpStatusText = mConnection.getResponseMessage();
|
| - mContentType = mConnection.getContentType();
|
| - mContentLength = mConnection.getContentLength();
|
| - if (mContentLengthLimit > 0 && mContentLength > mContentLengthLimit
|
| - && mCancelIfContentLengthOverLimit) {
|
| - onContentLengthOverLimit();
|
| - return;
|
| - }
|
| -
|
| - mListener.onResponseStarted(this);
|
| -
|
| - mResponseStream = isError(mHttpStatusCode) ? mConnection
|
| - .getErrorStream()
|
| - : stream;
|
| -
|
| - if (mResponseStream != null
|
| - && "gzip".equals(mConnection.getContentEncoding())) {
|
| - mResponseStream = new GZIPInputStream(mResponseStream);
|
| - mContentLength = -1;
|
| - }
|
| -
|
| - if (mOffset != 0) {
|
| - // The server may ignore the request for a byte range.
|
| - if (mHttpStatusCode == HttpURLConnection.HTTP_OK) {
|
| - if (mContentLength != -1) {
|
| - mContentLength -= mOffset;
|
| - }
|
| - mSkippingToOffset = true;
|
| - } else {
|
| - mSize = mOffset;
|
| - }
|
| - }
|
| -
|
| - if (mResponseStream != null) {
|
| - readingResponse = true;
|
| - readResponseAsync();
|
| - }
|
| - } catch (IOException e) {
|
| - mException = e;
|
| - } finally {
|
| - if (mPostDataChannel != null) {
|
| - try {
|
| - mPostDataChannel.close();
|
| - } catch (IOException e) {
|
| - // Ignore
|
| - }
|
| - }
|
| -
|
| - // Don't call onRequestComplete yet if we are reading the response
|
| - // on a separate thread
|
| - if (!readingResponse) {
|
| - mListener.onRequestComplete(this);
|
| - }
|
| - }
|
| - }
|
| -
|
| - private void uploadData() throws IOException {
|
| - mConnection.setDoOutput(true);
|
| - if (!TextUtils.isEmpty(mPostContentType)) {
|
| - mConnection.setRequestProperty("Content-Type", mPostContentType);
|
| - }
|
| -
|
| - OutputStream uploadStream = null;
|
| - try {
|
| - if (mPostData != null) {
|
| - mConnection.setFixedLengthStreamingMode(mPostData.length);
|
| - uploadStream = mConnection.getOutputStream();
|
| - uploadStream.write(mPostData);
|
| - } else {
|
| - mConnection.setFixedLengthStreamingMode(mUploadContentLength);
|
| - uploadStream = mConnection.getOutputStream();
|
| - byte[] bytes = new byte[MAX_CHUNK_SIZE];
|
| - ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
|
| - while (mPostDataChannel.read(byteBuffer) > 0) {
|
| - byteBuffer.flip();
|
| - uploadStream.write(bytes, 0, byteBuffer.limit());
|
| - byteBuffer.clear();
|
| - }
|
| - }
|
| - } finally {
|
| - if (uploadStream != null) {
|
| - uploadStream.close();
|
| - }
|
| - }
|
| - }
|
| -
|
| - private void readResponseAsync() {
|
| - getExecutor().execute(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - readResponse();
|
| - }
|
| - });
|
| - }
|
| -
|
| - private void readResponse() {
|
| - try {
|
| - if (mResponseStream != null) {
|
| - readResponseStream();
|
| - }
|
| - } catch (IOException e) {
|
| - mException = e;
|
| - } finally {
|
| - try {
|
| - mConnection.disconnect();
|
| - } catch (ArrayIndexOutOfBoundsException t) {
|
| - // Ignore it.
|
| - }
|
| -
|
| - try {
|
| - mSink.close();
|
| - } catch (IOException e) {
|
| - if (mException == null) {
|
| - mException = e;
|
| - }
|
| - }
|
| - }
|
| - mListener.onRequestComplete(this);
|
| - }
|
| -
|
| - private void readResponseStream() throws IOException {
|
| - byte[] buffer = new byte[MAX_CHUNK_SIZE];
|
| - int size;
|
| - while (!isCanceled() && (size = mResponseStream.read(buffer)) != -1) {
|
| - int start = 0;
|
| - int count = size;
|
| - mSize += size;
|
| - if (mSkippingToOffset) {
|
| - if (mSize <= mOffset) {
|
| - continue;
|
| - } else {
|
| - mSkippingToOffset = false;
|
| - start = (int) (mOffset - (mSize - size));
|
| - count -= start;
|
| - }
|
| - }
|
| -
|
| - if (mContentLengthLimit != 0 && mSize > mContentLengthLimit) {
|
| - count -= (int) (mSize - mContentLengthLimit);
|
| - if (count > 0) {
|
| - mSink.write(ByteBuffer.wrap(buffer, start, count));
|
| - }
|
| - onContentLengthOverLimit();
|
| - return;
|
| - }
|
| -
|
| - mSink.write(ByteBuffer.wrap(buffer, start, count));
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void cancel() {
|
| - synchronized (mLock) {
|
| - if (mCanceled) {
|
| - return;
|
| - }
|
| -
|
| - mCanceled = true;
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public boolean isCanceled() {
|
| - synchronized (mLock) {
|
| - return mCanceled;
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public String getNegotiatedProtocol() {
|
| - return "";
|
| - }
|
| -
|
| - @Override
|
| - public boolean wasCached() {
|
| - return false;
|
| - }
|
| -
|
| - @Override
|
| - public int getHttpStatusCode() {
|
| - int httpStatusCode = mHttpStatusCode;
|
| -
|
| - // If we have been able to successfully resume a previously interrupted
|
| - // download,
|
| - // the status code will be 206, not 200. Since the rest of the
|
| - // application is
|
| - // expecting 200 to indicate success, we need to fake it.
|
| - if (httpStatusCode == HttpURLConnection.HTTP_PARTIAL) {
|
| - httpStatusCode = HttpURLConnection.HTTP_OK;
|
| - }
|
| - return httpStatusCode;
|
| - }
|
| -
|
| - @Override
|
| - public String getHttpStatusText() {
|
| - return mHttpStatusText;
|
| - }
|
| -
|
| - @Override
|
| - public IOException getException() {
|
| - if (mException == null && mContentLengthOverLimit) {
|
| - mException = new ResponseTooLargeException();
|
| - }
|
| - return mException;
|
| - }
|
| -
|
| - private void onContentLengthOverLimit() {
|
| - mContentLengthOverLimit = true;
|
| - cancel();
|
| - }
|
| -
|
| - private static boolean isError(int statusCode) {
|
| - return (statusCode / 100) != 2;
|
| - }
|
| -
|
| - /**
|
| - * Returns the response as a ByteBuffer.
|
| - */
|
| - @Override
|
| - public ByteBuffer getByteBuffer() {
|
| - return ((ChunkedWritableByteChannel) mSink).getByteBuffer();
|
| - }
|
| -
|
| - @Override
|
| - public byte[] getResponseAsBytes() {
|
| - return ((ChunkedWritableByteChannel) mSink).getBytes();
|
| - }
|
| -
|
| - @Override
|
| - public long getContentLength() {
|
| - return mContentLength;
|
| - }
|
| -
|
| - @Override
|
| - public String getContentType() {
|
| - return mContentType;
|
| - }
|
| -
|
| - @Override
|
| - public String getHeader(String name) {
|
| - if (mConnection == null) {
|
| - throw new IllegalStateException("Response headers not available");
|
| - }
|
| - Map<String, List<String>> headerFields = mConnection.getHeaderFields();
|
| - if (headerFields != null) {
|
| - List<String> headerValues = headerFields.get(name);
|
| - if (headerValues != null) {
|
| - return TextUtils.join(", ", headerValues);
|
| - }
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - @Override
|
| - public Map<String, List<String>> getAllHeaders() {
|
| - if (mConnection == null) {
|
| - throw new IllegalStateException("Response headers not available");
|
| - }
|
| - return mConnection.getHeaderFields();
|
| - }
|
| -
|
| - private void validateNotStarted() {
|
| - if (mStarted) {
|
| - throw new IllegalStateException("Request already started");
|
| - }
|
| - }
|
| -}
|
|
|