Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions envoy_build_config/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ envoy_cc_library(
"@envoy//source/common/network:socket_lib",
"@envoy//source/common/upstream:logical_dns_cluster_lib",
"@envoy//source/extensions/clusters/dynamic_forward_proxy:cluster",
"@envoy//source/extensions/compression/brotli/decompressor:config",
"@envoy//source/extensions/compression/gzip/decompressor:config",
"@envoy//source/extensions/filters/http/buffer:config",
"@envoy//source/extensions/filters/http/decompressor:config",
Expand Down
8 changes: 8 additions & 0 deletions envoy_build_config/extension_registry.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
#include "source/common/network/socket_interface_impl.h"
#include "source/common/upstream/logical_dns_cluster.h"
#include "source/extensions/clusters/dynamic_forward_proxy/cluster.h"
#include "source/extensions/compression/brotli/decompressor/config.h"
#include "source/extensions/compression/gzip/decompressor/config.h"
#include "source/extensions/filters/http/buffer/config.h"
#include "source/extensions/filters/http/decompressor/config.h"
#include "source/extensions/filters/http/dynamic_forward_proxy/config.h"
#include "source/extensions/filters/http/router/config.h"
#include "source/extensions/filters/network/http_connection_manager/config.h"
#include "source/extensions/http/header_formatters/preserve_case/preserve_case_formatter.h"
#include "source/extensions/http/original_ip_detection/xff/config.h"
#include "source/extensions/stat_sinks/metrics_service/config.h"
#include "source/extensions/transport_sockets/raw_buffer/config.h"
Expand All @@ -18,12 +20,18 @@

#include "extension_registry_platform_additions.h"
#include "library/common/extensions/filters/http/assertion/config.h"
#include "library/common/extensions/filters/http/local_error/config.h"
#include "library/common/extensions/filters/http/network_configuration/config.h"
#include "library/common/extensions/filters/http/platform_bridge/config.h"
#include "library/common/extensions/filters/http/route_cache_reset/config.h"
#include "library/common/extensions/retry/options/network_configuration/config.h"

namespace Envoy {

void ExtensionRegistry::registerFactories() {
Envoy::Extensions::Clusters::DynamicForwardProxy::forceRegisterClusterFactory();
Envoy::Extensions::Compression::Brotli::Decompressor::
forceRegisterBrotliDecompressorLibraryFactory();
Envoy::Extensions::Compression::Gzip::Decompressor::forceRegisterGzipDecompressorLibraryFactory();
Envoy::Extensions::Http::OriginalIPDetection::Xff::forceRegisterXffIPDetectionFactory();
Envoy::Extensions::HttpFilters::Assertion::forceRegisterAssertionFilterFactory();
Expand Down
24 changes: 0 additions & 24 deletions envoy_build_config/extension_registry.h
Original file line number Diff line number Diff line change
@@ -1,29 +1,5 @@
#pragma once

#include "source/common/upstream/logical_dns_cluster.h"
#include "source/extensions/clusters/dynamic_forward_proxy/cluster.h"
#include "source/extensions/compression/gzip/decompressor/config.h"
#include "source/extensions/filters/http/buffer/config.h"
#include "source/extensions/filters/http/decompressor/config.h"
#include "source/extensions/filters/http/dynamic_forward_proxy/config.h"
#include "source/extensions/filters/http/router/config.h"
#include "source/extensions/filters/network/http_connection_manager/config.h"
#include "source/extensions/http/header_formatters/preserve_case/preserve_case_formatter.h"
#include "source/extensions/http/original_ip_detection/xff/config.h"
#include "source/extensions/stat_sinks/metrics_service/config.h"
#include "source/extensions/transport_sockets/raw_buffer/config.h"
#include "source/extensions/transport_sockets/tls/cert_validator/default_validator.h"
#include "source/extensions/transport_sockets/tls/config.h"
#include "source/extensions/upstreams/http/generic/config.h"

#include "extension_registry_platform_additions.h"
#include "library/common/extensions/filters/http/assertion/config.h"
#include "library/common/extensions/filters/http/local_error/config.h"
#include "library/common/extensions/filters/http/network_configuration/config.h"
#include "library/common/extensions/filters/http/platform_bridge/config.h"
#include "library/common/extensions/filters/http/route_cache_reset/config.h"
#include "library/common/extensions/retry/options/network_configuration/config.h"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice cleanup.


namespace Envoy {
class ExtensionRegistry {
public:
Expand Down
1 change: 1 addition & 0 deletions envoy_build_config/extensions_build_config.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ EXTENSIONS = {
"envoy.filters.connection_pools.http.generic": "//source/extensions/upstreams/http/generic:config",
"envoy.filters.http.assertion": "@envoy_mobile//library/common/extensions/filters/http/assertion:config",
"envoy.filters.http.buffer": "//source/extensions/filters/http/buffer:config",
"envoy.filters.http.decompressor": "//source/extensions/filters/http/decompressor:config",
"envoy.filters.http.dynamic_forward_proxy": "//source/extensions/filters/http/dynamic_forward_proxy:config",
"envoy.filters.http.local_error": "@envoy_mobile//library/common/extensions/filters/http/local_error:config",
"envoy.filters.http.platform_bridge": "@envoy_mobile//library/common/extensions/filters/http/platform_bridge:config",
Expand Down
17 changes: 0 additions & 17 deletions library/java/org/chromium/net/impl/CronetEngineBuilderImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import android.content.Context;
import android.util.Base64;
import androidx.annotation.IntDef;
import androidx.annotation.VisibleForTesting;
import java.io.File;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
Expand Down Expand Up @@ -78,7 +77,6 @@ final static class Pkp {
private int mHttpCacheMode;
private long mHttpCacheMaxSize;
private String mExperimentalOptions;
protected long mMockCertVerifier;
private boolean mNetworkQualityEstimatorEnabled;
private int mThreadPriority = INVALID_THREAD_PRIORITY;
private String mLogLevel = "info";
Expand Down Expand Up @@ -318,21 +316,6 @@ public CronetEngineBuilderImpl setExperimentalOptions(String options) {

public String experimentalOptions() { return mExperimentalOptions; }

/**
* Sets a native MockCertVerifier for testing. See {@code MockCertVerifier.createMockCertVerifier}
* for a method that can be used to create a MockCertVerifier.
*
* @param mockCertVerifier pointer to native MockCertVerifier.
* @return the builder to facilitate chaining.
*/
@VisibleForTesting
public CronetEngineBuilderImpl setMockCertVerifierForTesting(long mockCertVerifier) {
mMockCertVerifier = mockCertVerifier;
return this;
}

long mockCertVerifier() { return mMockCertVerifier; }

/**
* @return true if the network quality estimator has been enabled for
* this builder.
Expand Down
3 changes: 3 additions & 0 deletions library/java/org/chromium/net/impl/CronetUrlRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -871,6 +871,9 @@ public void onTrailers(Map<String, List<String>> trailers, EnvoyStreamIntel stre
if (completeAbandonIfAny(originalState, updatedState)) {
return;
}
if (mState.compareAndSet(State.READING, State.COMPLETE)) {
mCronvoyCallbacks.successReady(SucceededState.FINAL_READ_DONE);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static io.envoyproxy.envoymobile.engine.EnvoyConfiguration.TrustChainVerification.VERIFY_TRUST_CHAIN;

import android.content.Context;
import androidx.annotation.VisibleForTesting;
import io.envoyproxy.envoymobile.engine.AndroidEngineImpl;
import io.envoyproxy.envoymobile.engine.AndroidJniLibrary;
import io.envoyproxy.envoymobile.engine.AndroidNetworkMonitor;
Expand All @@ -15,6 +16,7 @@
import io.envoyproxy.envoymobile.engine.types.EnvoyLogger;
import io.envoyproxy.envoymobile.engine.types.EnvoyOnEngineRunning;
import io.envoyproxy.envoymobile.engine.types.EnvoyStringAccessor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
Expand All @@ -26,6 +28,24 @@
*/
public class NativeCronetEngineBuilderImpl extends CronetEngineBuilderImpl {

private static final String BROTLI_CONFIG =
"\n"
+
" \"@type\": type.googleapis.com/envoy.extensions.filters.http.decompressor.v3.Decompressor\n"
+ " decompressor_library:\n"
+ " name: text_optimized\n"
+ " typed_config:\n"
+
" \"@type\": type.googleapis.com/envoy.extensions.compression.brotli.decompressor.v3.Brotli\n"
+ " request_direction_config:\n"
+ " common_config:\n"
+ " enabled:\n"
+ " default_value: false\n"
+ " runtime_key: request_decompressor_enabled\n"
+ " response_direction_config:\n"
+ " common_config:\n"
+ " ignore_no_transform_header: true\n";

private final EnvoyLogger mEnvoyLogger = null;
private final EnvoyEventTracker mEnvoyEventTracker = null;
private boolean mAdminInterfaceEnabled = false;
Expand All @@ -51,9 +71,6 @@ public class NativeCronetEngineBuilderImpl extends CronetEngineBuilderImpl {
private String mAppId = "unspecified";
private TrustChainVerification mTrustChainVerification = VERIFY_TRUST_CHAIN;
private String mVirtualClusters = "[]";
private List<EnvoyHTTPFilterFactory> mPlatformFilterChain = Collections.emptyList();
private List<EnvoyNativeFilterConfig> mNativeFilterChain = Collections.emptyList();
private Map<String, EnvoyStringAccessor> mStringAccessors = Collections.emptyMap();

/**
* Builder for Native Cronet Engine. Default config enables SPDY, disables QUIC and HTTP cache.
Expand All @@ -62,6 +79,17 @@ public class NativeCronetEngineBuilderImpl extends CronetEngineBuilderImpl {
*/
public NativeCronetEngineBuilderImpl(Context context) { super(context); }

/**
* Indicates to skip the TLS certificate verification.
*
* @return the builder to facilitate chaining.
*/
@VisibleForTesting
public CronetEngineBuilderImpl setMockCertVerifierForTesting() {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like this logic is (roughly) moving from CronetEngineBuilder to NativeCronetEngineBuilderImpl. Out of curiosity, what's that motivation?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I moved this here because this is an EnvoyMobile enum that is being use, and this is the only class bridging EM and Cronet for the Configuration.

The second weaker reason is that CronetEngineBuilderImpl (where that method was before this PR) is also used by the Java implementation of Cronet, where it makes no sense.

mTrustChainVerification = TrustChainVerification.ACCEPT_UNTRUSTED;
return this;
}

@Override
public ExperimentalCronetEngine build() {
if (getUserAgent() == null) {
Expand All @@ -80,14 +108,21 @@ EnvoyEngine createEngine(EnvoyOnEngineRunning onEngineRunning) {
}

private EnvoyConfiguration createEnvoyConfiguration() {
List<EnvoyHTTPFilterFactory> platformFilterChain = Collections.emptyList();
List<EnvoyNativeFilterConfig> nativeFilterChain = new ArrayList<>();
Map<String, EnvoyStringAccessor> stringAccessors = Collections.emptyMap();
if (brotliEnabled()) {
nativeFilterChain.add(
new EnvoyNativeFilterConfig("envoy.filters.http.decompressor", BROTLI_CONFIG));
}
return new EnvoyConfiguration(
mAdminInterfaceEnabled, mGrpcStatsDomain, mStatsDPort, mConnectTimeoutSeconds,
mDnsRefreshSeconds, mDnsFailureRefreshSecondsBase, mDnsFailureRefreshSecondsMax,
mDnsQueryTimeoutSeconds, mDnsPreresolveHostnames, mDnsFallbackNameservers,
mEnableDnsFilterUnroutableFamilies, mEnableHappyEyeballs, mEnableInterfaceBinding,
mH2ConnectionKeepaliveIdleIntervalMilliseconds, mH2ConnectionKeepaliveTimeoutSeconds,
mH2RawDomains, mStatsFlushSeconds, mStreamIdleTimeoutSeconds, mPerTryIdleTimeoutSeconds,
mAppVersion, mAppId, mTrustChainVerification, mVirtualClusters, mNativeFilterChain,
mPlatformFilterChain, mStringAccessors);
mAppVersion, mAppId, mTrustChainVerification, mVirtualClusters, nativeFilterChain,
platformFilterChain, stringAccessors);
}
}
1 change: 1 addition & 0 deletions test/java/org/chromium/net/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ envoy_package()
envoy_mobile_android_test(
name = "net_tests",
srcs = [
"BrotliTest.java",
"CronetEngineBuilderTest.java",
"CronetStressTest.java",
"DiskStorageTest.java",
Expand Down
105 changes: 105 additions & 0 deletions test/java/org/chromium/net/BrotliTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package org.chromium.net;

import static org.chromium.net.testing.CronetTestRule.SERVER_CERT_PEM;
import static org.chromium.net.testing.CronetTestRule.SERVER_KEY_PKCS8_PEM;
import static org.chromium.net.testing.CronetTestRule.getContext;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import androidx.test.filters.SmallTest;
import org.chromium.net.testing.CronetTestRule;
import org.chromium.net.testing.CronetTestRule.OnlyRunNativeCronet;
import org.chromium.net.testing.CronetTestUtil;
import org.chromium.net.testing.Feature;
import org.chromium.net.testing.Http2TestServer;
import org.chromium.net.testing.TestFilesInstaller;
import org.chromium.net.testing.TestUrlRequestCallback;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;

/**
* Simple test for Brotli support.
*/
@RunWith(RobolectricTestRunner.class)
public class BrotliTest {
@Rule public final CronetTestRule mTestRule = new CronetTestRule();

private CronetEngine mCronetEngine;

@Before
public void setUp() throws Exception {
TestFilesInstaller.installIfNeeded(getContext());
assertTrue(
Http2TestServer.startHttp2TestServer(getContext(), SERVER_CERT_PEM, SERVER_KEY_PKCS8_PEM));
}

@After
public void tearDown() throws Exception {
assertTrue(Http2TestServer.shutdownHttp2TestServer());
if (mCronetEngine != null) {
mCronetEngine.shutdown();
}
}

@Test
@SmallTest
@Feature({"Cronet"})
@OnlyRunNativeCronet
public void testBrotliAdvertised() throws Exception {
ExperimentalCronetEngine.Builder builder = new ExperimentalCronetEngine.Builder(getContext());
builder.enableBrotli(true);
CronetTestUtil.setMockCertVerifierForTesting(builder);
mCronetEngine = builder.build();
String url = Http2TestServer.getEchoAllHeadersUrl();
TestUrlRequestCallback callback = startAndWaitForComplete(url);
assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
// TODO(carloseltuerto): also support "deflate" decompressor - Cronet does.
assertTrue(callback.mResponseAsString.contains("accept-encoding: br,gzip"));
}

@Test
@SmallTest
@Feature({"Cronet"})
@OnlyRunNativeCronet
public void testBrotliNotAdvertised() throws Exception {
ExperimentalCronetEngine.Builder builder = new ExperimentalCronetEngine.Builder(getContext());
CronetTestUtil.setMockCertVerifierForTesting(builder);
mCronetEngine = builder.build();
String url = Http2TestServer.getEchoAllHeadersUrl();
TestUrlRequestCallback callback = startAndWaitForComplete(url);
assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
assertFalse(callback.mResponseAsString.contains("br"));
}

@Test
@SmallTest
@Feature({"Cronet"})
@OnlyRunNativeCronet
public void testBrotliDecoded() throws Exception {
ExperimentalCronetEngine.Builder builder = new ExperimentalCronetEngine.Builder(getContext());
builder.enableBrotli(true);
CronetTestUtil.setMockCertVerifierForTesting(builder);
mCronetEngine = builder.build();
String url = Http2TestServer.getServeSimpleBrotliResponse();
TestUrlRequestCallback callback = startAndWaitForComplete(url);
assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
String expectedResponse = "The quick brown fox jumps over the lazy dog";
assertEquals(expectedResponse, callback.mResponseAsString);
// TODO(https://github.com/envoyproxy/envoy-mobile/issues/2086): uncomment this line.
// assertEquals(callback.mResponseInfo.getAllHeaders().get("content-encoding").get(0),"br");
}

private TestUrlRequestCallback startAndWaitForComplete(String url) {
TestUrlRequestCallback callback = new TestUrlRequestCallback();
UrlRequest.Builder builder =
mCronetEngine.newUrlRequestBuilder(url, callback, callback.getExecutor());
builder.build().start();
callback.blockForDone();
return callback;
}
}
1 change: 1 addition & 0 deletions test/java/org/chromium/net/testing/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ android_library(
"ConditionVariable.java",
"ContextUtils.java",
"CronetTestRule.java",
"CronetTestUtil.java",
"FailurePhase.java",
"Feature.java",
"FileUtils.java",
Expand Down
21 changes: 21 additions & 0 deletions test/java/org/chromium/net/testing/CronetTestUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.chromium.net.testing;

import org.chromium.net.ExperimentalCronetEngine;
import org.chromium.net.impl.NativeCronetEngineBuilderImpl;

/**
* Utilities for Cronet testing
*/
public final class CronetTestUtil {

public static void setMockCertVerifierForTesting(ExperimentalCronetEngine.Builder builder) {
getCronetEngineBuilderImpl(builder).setMockCertVerifierForTesting();
}

public static NativeCronetEngineBuilderImpl
getCronetEngineBuilderImpl(ExperimentalCronetEngine.Builder builder) {
return (NativeCronetEngineBuilderImpl)builder.getBuilderDelegate();
}

private CronetTestUtil() {}
}