// 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. * *

{@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. *

{@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 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.

Note: 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); } }