265 lines
8.9 KiB
Java
265 lines
8.9 KiB
Java
![]() |
// 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);
|
||
|
}
|
||
|
}
|