blob: 828d6079a06feddc7873cb3a4324fee62c7f2acc [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.net.impl;
import androidx.annotation.IntDef;
import org.chromium.net.ExperimentalUrlRequest;
import org.chromium.net.UploadDataProvider;
import org.chromium.net.UrlRequest;
import org.chromium.net.UrlRequest.Status;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.Executor;
/**
* Base class for classes that implement {@link UrlRequest} including experimental
* features. {@link CronetUrlRequest} and {@link JavaUrlRequest} extends this class.
*/
public abstract class UrlRequestBase extends ExperimentalUrlRequest {
/**
* Sets the HTTP method verb to use for this request. Must be done before
* request has started.
*
* <p>The default when this method is not called is "GET" if the request has
* no body or "POST" if it does.
*
* @param method "GET", "HEAD", "DELETE", "POST" or "PUT".
*/
protected abstract void setHttpMethod(String method);
/**
* Adds a request header. Must be done before request has started.
*
* @param header header name.
* @param value header value.
*/
protected abstract void addHeader(String header, String value);
/**
* Sets upload data provider. Must be done before request has started. May only be
* invoked once per request. Switches method to "POST" if not explicitly
* set. Starting the request will throw an exception if a Content-Type
* header is not set.
*
* @param uploadDataProvider responsible for providing the upload data.
* @param executor All {@code uploadDataProvider} methods will be invoked
* using this {@code Executor}. May optionally be the same
* {@code Executor} the request itself is using.
*/
protected abstract void setUploadDataProvider(
UploadDataProvider uploadDataProvider, Executor executor);
/** Possible URL Request statuses. */
@IntDef({
Status.INVALID,
Status.IDLE,
Status.WAITING_FOR_STALLED_SOCKET_POOL,
Status.WAITING_FOR_AVAILABLE_SOCKET,
Status.WAITING_FOR_DELEGATE,
Status.WAITING_FOR_CACHE,
Status.DOWNLOADING_PAC_FILE,
Status.RESOLVING_PROXY_FOR_URL,
Status.RESOLVING_HOST_IN_PAC_FILE,
Status.ESTABLISHING_PROXY_TUNNEL,
Status.RESOLVING_HOST,
Status.CONNECTING,
Status.SSL_HANDSHAKE,
Status.SENDING_REQUEST,
Status.WAITING_FOR_RESPONSE,
Status.READING_RESPONSE
})
@Retention(RetentionPolicy.SOURCE)
public @interface StatusValues {}
/**
* Convert a LoadState int to one of values listed above.
* @param loadState a LoadState to convert.
* @return static int Status.
*/
@StatusValues
public static int convertLoadState(int loadState) {
assert loadState >= LoadState.IDLE && loadState <= LoadState.READING_RESPONSE;
switch (loadState) {
case (LoadState.IDLE):
return Status.IDLE;
case (LoadState.WAITING_FOR_STALLED_SOCKET_POOL):
return Status.WAITING_FOR_STALLED_SOCKET_POOL;
case (LoadState.WAITING_FOR_AVAILABLE_SOCKET):
return Status.WAITING_FOR_AVAILABLE_SOCKET;
case (LoadState.WAITING_FOR_DELEGATE):
return Status.WAITING_FOR_DELEGATE;
case (LoadState.WAITING_FOR_CACHE):
return Status.WAITING_FOR_CACHE;
case (LoadState.DOWNLOADING_PAC_FILE):
return Status.DOWNLOADING_PAC_FILE;
case (LoadState.RESOLVING_PROXY_FOR_URL):
return Status.RESOLVING_PROXY_FOR_URL;
case (LoadState.RESOLVING_HOST_IN_PAC_FILE):
return Status.RESOLVING_HOST_IN_PAC_FILE;
case (LoadState.ESTABLISHING_PROXY_TUNNEL):
return Status.ESTABLISHING_PROXY_TUNNEL;
case (LoadState.RESOLVING_HOST):
return Status.RESOLVING_HOST;
case (LoadState.CONNECTING):
return Status.CONNECTING;
case (LoadState.SSL_HANDSHAKE):
return Status.SSL_HANDSHAKE;
case (LoadState.SENDING_REQUEST):
return Status.SENDING_REQUEST;
case (LoadState.WAITING_FOR_RESPONSE):
return Status.WAITING_FOR_RESPONSE;
case (LoadState.READING_RESPONSE):
return Status.READING_RESPONSE;
default:
// A load state is retrieved but there is no corresponding
// request status. This most likely means that the mapping is
// incorrect.
throw new IllegalArgumentException("No request status found.");
}
}
}