blob: af9c46d57d9db22a3b1215e93acfed9479f8e9ac [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;
import android.content.Context;
import androidx.annotation.VisibleForTesting;
import java.io.IOException;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.Executor;
/**
* {@link CronetEngine} that exposes experimental features. To obtain an instance of this class,
* cast a {@code CronetEngine} to this type. Every instance of {@code CronetEngine} can be cast to
* an instance of this class, as they are backed by the same implementation and hence perform
* identically. Instances of this class are not meant for general use, but instead only to access
* experimental features. Experimental features may be deprecated in the future. Use at your own
* risk.
*
* <p>{@hide since this class exposes experimental features that should be hidden.}
*
* @deprecated scheduled for deletion, don't use in new code.
*/
@Deprecated
public abstract class ExperimentalCronetEngine extends CronetEngine {
/** The value of a connection metric is unknown. */
public static final int CONNECTION_METRIC_UNKNOWN = CronetEngine.CONNECTION_METRIC_UNKNOWN;
/**
* The estimate of the effective connection type is unknown.
*
* @see #getEffectiveConnectionType
*/
public static final int EFFECTIVE_CONNECTION_TYPE_UNKNOWN =
CronetEngine.EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
/**
* The device is offline.
*
* @see #getEffectiveConnectionType
*/
public static final int EFFECTIVE_CONNECTION_TYPE_OFFLINE =
CronetEngine.EFFECTIVE_CONNECTION_TYPE_OFFLINE;
/**
* The estimate of the effective connection type is slow 2G.
*
* @see #getEffectiveConnectionType
*/
public static final int EFFECTIVE_CONNECTION_TYPE_SLOW_2G =
CronetEngine.EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
/**
* The estimate of the effective connection type is 2G.
*
* @see #getEffectiveConnectionType
*/
public static final int EFFECTIVE_CONNECTION_TYPE_2G =
CronetEngine.EFFECTIVE_CONNECTION_TYPE_2G;
/**
* The estimate of the effective connection type is 3G.
*
* @see #getEffectiveConnectionType
*/
public static final int EFFECTIVE_CONNECTION_TYPE_3G =
CronetEngine.EFFECTIVE_CONNECTION_TYPE_3G;
/**
* The estimate of the effective connection type is 4G.
*
* @see #getEffectiveConnectionType
*/
public static final int EFFECTIVE_CONNECTION_TYPE_4G =
CronetEngine.EFFECTIVE_CONNECTION_TYPE_4G;
/** The value to be used to undo any previous network binding. */
public static final long UNBIND_NETWORK_HANDLE = CronetEngine.UNBIND_NETWORK_HANDLE;
/**
* A version of {@link CronetEngine.Builder} that exposes experimental features. Instances of
* this class are not meant for general use, but instead only to access experimental features.
* Experimental features may be deprecated in the future. Use at your own risk.
*/
public static class Builder extends CronetEngine.Builder {
/**
* Constructs a {@link Builder} object that facilitates creating a {@link CronetEngine}. The
* default configuration enables HTTP/2 and disables QUIC, SDCH and the HTTP cache.
*
* @param context Android {@link Context}, which is used by the Builder to retrieve the
* application context. A reference to only the application context will be kept, so as
* to avoid extending the lifetime of {@code context} unnecessarily.
*/
public Builder(Context context) {
super(context);
}
/**
* Constructs {@link Builder} with a given delegate that provides the actual implementation
* of the {@code Builder} methods. This constructor is used only by the internal
* implementation.
*
* @param builderDelegate delegate that provides the actual implementation.
* <p>{@hide}
*/
public Builder(ICronetEngineBuilder builderDelegate) {
super(builderDelegate);
}
/**
* Sets experimental options to be used in Cronet.
*
* @param options JSON formatted experimental options.
* @return the builder to facilitate chaining.
*/
public Builder setExperimentalOptions(String options) {
mBuilderDelegate.setExperimentalOptions(options);
return this;
}
/**
* Returns delegate, only for testing.
*
* @hide
*/
@VisibleForTesting
public ICronetEngineBuilder getBuilderDelegate() {
return mBuilderDelegate;
}
// To support method chaining, override superclass methods to return an
// instance of this class instead of the parent.
@Override
public Builder setUserAgent(String userAgent) {
super.setUserAgent(userAgent);
return this;
}
@Override
public Builder setStoragePath(String value) {
super.setStoragePath(value);
return this;
}
@Override
public Builder setLibraryLoader(LibraryLoader loader) {
super.setLibraryLoader(loader);
return this;
}
@Override
public Builder enableQuic(boolean value) {
super.enableQuic(value);
return this;
}
@Override
public Builder enableHttp2(boolean value) {
super.enableHttp2(value);
return this;
}
@Override
@QuicOptions.Experimental
public Builder setQuicOptions(QuicOptions options) {
super.setQuicOptions(options);
return this;
}
@Override
@DnsOptions.Experimental
public Builder setDnsOptions(DnsOptions options) {
super.setDnsOptions(options);
return this;
}
@Override
@ConnectionMigrationOptions.Experimental
public Builder setConnectionMigrationOptions(ConnectionMigrationOptions options) {
super.setConnectionMigrationOptions(options);
return this;
}
@Override
public Builder enableSdch(boolean value) {
return this;
}
@Override
public Builder enableHttpCache(int cacheMode, long maxSize) {
super.enableHttpCache(cacheMode, maxSize);
return this;
}
@Override
public Builder addQuicHint(String host, int port, int alternatePort) {
super.addQuicHint(host, port, alternatePort);
return this;
}
@Override
public Builder addPublicKeyPins(
String hostName,
Set<byte[]> pinsSha256,
boolean includeSubdomains,
Date expirationDate) {
super.addPublicKeyPins(hostName, pinsSha256, includeSubdomains, expirationDate);
return this;
}
@Override
public Builder enablePublicKeyPinningBypassForLocalTrustAnchors(boolean value) {
super.enablePublicKeyPinningBypassForLocalTrustAnchors(value);
return this;
}
@Override
public Builder enableNetworkQualityEstimator(boolean value) {
super.enableNetworkQualityEstimator(value);
return this;
}
@Override
public Builder setThreadPriority(int priority) {
super.setThreadPriority(priority);
return this;
}
@Override
public ExperimentalCronetEngine build() {
return mBuilderDelegate.build();
}
}
@Override
public abstract ExperimentalBidirectionalStream.Builder newBidirectionalStreamBuilder(
String url, BidirectionalStream.Callback callback, Executor executor);
@Override
public abstract ExperimentalUrlRequest.Builder newUrlRequestBuilder(
String url, UrlRequest.Callback callback, Executor executor);
/**
* Establishes a new connection to the resource specified by the {@link URL} {@code url} using
* the given proxy. <p> <b>Note:</b> Cronet's {@link java.net.HttpURLConnection} implementation
* is subject to certain limitations, see {@link #createURLStreamHandlerFactory} for details.
*
* @param url URL of resource to connect to.
* @param proxy proxy to use when establishing connection.
* @return an {@link java.net.HttpURLConnection} instance implemented by this CronetEngine.
* @throws IOException if an error occurs while opening the connection.
*/
// TODO(pauljensen): Expose once implemented, http://crbug.com/418111
public URLConnection openConnection(URL url, Proxy proxy) throws IOException {
return url.openConnection(proxy);
}
}