blob: 9b35112e930589b2befb85222597c4d4ce7ccd7f [file] [log] [blame]
// Copyright 2023 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 static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL;
import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION;
import android.net.Network;
import android.net.http.HttpEngine;
import androidx.annotation.RequiresExtension;
import org.chromium.net.ExperimentalCronetEngine;
import java.io.IOException;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandlerFactory;
import java.util.concurrent.Executor;
@RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION)
class AndroidHttpEngineWrapper extends ExperimentalCronetEngine {
private final HttpEngine mBackend;
public AndroidHttpEngineWrapper(HttpEngine backend) {
this.mBackend = backend;
}
@Override
public String getVersionString() {
return HttpEngine.getVersionString();
}
@Override
public void shutdown() {
mBackend.shutdown();
}
@Override
public void startNetLogToFile(String fileName, boolean logAll) {
// TODO(danstahr): Hidden API access
}
@Override
public void stopNetLog() {
// TODO(danstahr): Hidden API access
}
@Override
public byte[] getGlobalMetricsDeltas() {
// TODO(danstahr): Hidden API access
return new byte[0];
}
@Override
public void bindToNetwork(long networkHandle) {
// Network#fromNetworkHandle throws IAE if networkHandle does not translate to a valid
// Network. Though, this can only happen if we're given a fake networkHandle (in which case
// we will throw, which is fine).
Network network =
networkHandle == UNBIND_NETWORK_HANDLE
? null
: Network.fromNetworkHandle(networkHandle);
mBackend.bindToNetwork(network);
}
@Override
public URLConnection openConnection(URL url) throws IOException {
return CronetExceptionTranslationUtils.executeTranslatingCronetExceptions(
() -> mBackend.openConnection(url), IOException.class);
}
@Override
public URLConnection openConnection(URL url, Proxy proxy) throws IOException {
// HttpEngine doesn't expose an openConnection(URL, Proxy) method. To maintain compatibility
// copy-paste CronetUrlRequestContext's logic here.
if (proxy.type() != Proxy.Type.DIRECT) {
throw new UnsupportedOperationException();
}
String protocol = url.getProtocol();
if ("http".equals(protocol) || "https".equals(protocol)) {
return openConnection(url);
}
throw new UnsupportedOperationException("Unexpected protocol:" + protocol);
}
@Override
public URLStreamHandlerFactory createURLStreamHandlerFactory() {
return mBackend.createUrlStreamHandlerFactory();
}
@Override
public org.chromium.net.ExperimentalBidirectionalStream.Builder newBidirectionalStreamBuilder(
String url, org.chromium.net.BidirectionalStream.Callback callback, Executor executor) {
return new AndroidBidirectionalStreamBuilderWrapper(
mBackend.newBidirectionalStreamBuilder(
url, executor, new AndroidBidirectionalStreamCallbackWrapper(callback)));
}
@Override
public org.chromium.net.ExperimentalUrlRequest.Builder newUrlRequestBuilder(
String url, org.chromium.net.UrlRequest.Callback callback, Executor executor) {
return new AndroidUrlRequestBuilderWrapper(
mBackend.newUrlRequestBuilder(
url, executor, new AndroidUrlRequestCallbackWrapper(callback)));
}
}