Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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 docs/root/intro/version_history.rst
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ Features:
- android: create simple persistent SharedPreferencesStore (:issue: `#2319 <2319>`)
- iOS: A documentation archive is now included in the GitHub release artifact (:issue: `#2335 <2335>`)
- api: improved C++ APIs compatibility with Java / Kotlin / Swift (:issue `#2362 <2362>`)
- api: add option to use the a ``getaddr``-based system DNS resolver instead of c-ares (:issue: `#2419 <2419>`)
Comment thread
jpsim marked this conversation as resolved.
Outdated

0.4.6 (April 26, 2022)
========================
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 @@ -18,6 +18,7 @@ EXTENSIONS = {
"envoy.http.original_ip_detection.xff": "//source/extensions/http/original_ip_detection/xff:config",
"envoy.key_value.platform": "@envoy_mobile//library/common/extensions/key_value/platform:config",
"envoy.network.dns_resolver.apple": "//source/extensions/network/dns_resolver/apple:config",
"envoy.network.dns_resolver.getaddrinfo": "//source/extensions/network/dns_resolver/getaddrinfo:config",
"envoy.retry.options.network_configuration": "@envoy_mobile//library/common/extensions/retry/options/network_configuration:config",
"envoy.stat_sinks.metrics_service": "//source/extensions/stat_sinks/metrics_service:config",
"envoy.transport_sockets.raw_buffer": "//source/extensions/transport_sockets/raw_buffer:config",
Expand Down
42 changes: 29 additions & 13 deletions library/cc/engine_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,7 @@ namespace Platform {

EngineBuilder::EngineBuilder(std::string config_template)
: callbacks_(std::make_shared<EngineCallbacks>()), config_template_(config_template) {}
EngineBuilder::EngineBuilder() : EngineBuilder(std::string(config_template)) {
#if defined(__APPLE__)
dns_resolver_name_ = "envoy.network.dns_resolver.apple";
dns_resolver_config_ = "{\"@type\":\"type.googleapis.com/"
"envoy.extensions.network.dns_resolver.apple.v3.AppleDnsResolverConfig\"}";
#else
dns_resolver_name_ = "envoy.network.dns_resolver.cares";
dns_resolver_config_ = "{\"@type\":\"type.googleapis.com/"
"envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig\"}";
#endif
}
EngineBuilder::EngineBuilder() : EngineBuilder(std::string(config_template)) {}

EngineBuilder& EngineBuilder::addLogLevel(LogLevel log_level) {
this->log_level_ = log_level;
Expand Down Expand Up @@ -65,6 +55,11 @@ EngineBuilder::addDnsPreresolveHostnames(const std::string& dns_preresolve_hostn
return *this;
}

EngineBuilder& EngineBuilder::useDnsSystemResolver(bool use_system_resolver) {
this->use_system_resolver_ = use_system_resolver;
return *this;
}

EngineBuilder& EngineBuilder::addH2ConnectionKeepaliveIdleIntervalMilliseconds(
int h2_connection_keepalive_idle_interval_milliseconds) {
this->h2_connection_keepalive_idle_interval_milliseconds_ =
Expand Down Expand Up @@ -119,15 +114,36 @@ EngineBuilder& EngineBuilder::enableBrotli(bool brotli_on) {
}

std::string EngineBuilder::generateConfigStr() {
#if defined(__APPLE__)
std::string dns_resolver_name = "envoy.network.dns_resolver.apple";
std::string dns_resolver_config =
"{\"@type\":\"type.googleapis.com/"
"envoy.extensions.network.dns_resolver.apple.v3.AppleDnsResolverConfig\"}";
#else
std::string dns_resolver_name = "";
std::string dns_resolver_config = "";
if (this->use_system_resolver_) {
dns_resolver_name = "envoy.network.dns_resolver.getaddrinfo";
dns_resolver_config =
"{\"@type\":\"type.googleapis.com/"
"envoy.extensions.network.dns_resolver.getaddrinfo.v3.GetAddrInfoDnsResolverConfig\"}";
} else {
dns_resolver_name = "envoy.network.dns_resolver.cares";
dns_resolver_config =
"{\"@type\":\"type.googleapis.com/"
"envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig\"}";
}
#endif

std::vector<std::pair<std::string, std::string>> replacements{
{"connect_timeout", fmt::format("{}s", this->connect_timeout_seconds_)},
{"dns_fail_base_interval", fmt::format("{}s", this->dns_failure_refresh_seconds_base_)},
{"dns_fail_max_interval", fmt::format("{}s", this->dns_failure_refresh_seconds_max_)},
{"dns_preresolve_hostnames", this->dns_preresolve_hostnames_},
{"dns_refresh_rate", fmt::format("{}s", this->dns_refresh_seconds_)},
{"dns_query_timeout", fmt::format("{}s", this->dns_query_timeout_seconds_)},
{"dns_resolver_name", dns_resolver_name_},
{"dns_resolver_config", dns_resolver_config_},
{"dns_resolver_name", dns_resolver_name},
{"dns_resolver_config", dns_resolver_config},
{"h2_connection_keepalive_idle_interval",
fmt::format("{}s", this->h2_connection_keepalive_idle_interval_milliseconds_ / 1000.0)},
{"h2_connection_keepalive_timeout",
Expand Down
4 changes: 2 additions & 2 deletions library/cc/engine_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class EngineBuilder {
EngineBuilder& addDnsFailureRefreshSeconds(int base, int max);
EngineBuilder& addDnsQueryTimeoutSeconds(int dns_query_timeout_seconds);
EngineBuilder& addDnsPreresolveHostnames(const std::string& dns_preresolve_hostnames);
EngineBuilder& useDnsSystemResolver(bool use_system_resolver);
EngineBuilder& addH2ConnectionKeepaliveIdleIntervalMilliseconds(
int h2_connection_keepalive_idle_interval_milliseconds);
EngineBuilder&
Expand Down Expand Up @@ -63,6 +64,7 @@ class EngineBuilder {
int dns_failure_refresh_seconds_max_ = 10;
int dns_query_timeout_seconds_ = 25;
std::string dns_preresolve_hostnames_ = "[]";
bool use_system_resolver_ = false;
int h2_connection_keepalive_idle_interval_milliseconds_ = 100000000;
int h2_connection_keepalive_timeout_seconds_ = 10;
int stats_flush_seconds_ = 60;
Expand All @@ -72,8 +74,6 @@ class EngineBuilder {
std::string virtual_clusters_ = "[]";
std::string config_override_for_tests_ = "";
std::string admin_address_path_for_tests_ = "";
std::string dns_resolver_name_ = "";
std::string dns_resolver_config_ = "";
int stream_idle_timeout_seconds_ = 15;
int per_try_idle_timeout_seconds_ = 15;
bool gzip_filter_ = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public enum TrustChainVerification {
public final String dnsPreresolveHostnames;
public final List<String> dnsFallbackNameservers;
public final Boolean dnsFilterUnroutableFamilies;
public final Boolean dnsUseSystemResolver;
public final Boolean enableDrainPostDnsRefresh;
public final Boolean enableHttp3;
public final Boolean enableGzip;
Expand Down Expand Up @@ -77,6 +78,7 @@ public enum TrustChainVerification {
* @param dnsPreresolveHostnames hostnames to preresolve on Envoy Client construction.
* @param dnsFallbackNameservers addresses to use as DNS name server fallback.
* @param dnsFilterUnroutableFamilies whether to filter unroutable IP families or not.
* @param dnsUseSystemResolver whether to use the getaddr-based system resolver or c-ares.
Comment thread
jpsim marked this conversation as resolved.
Outdated
* @param enableDrainPostDnsRefresh whether to drain connections after soft DNS refresh.
* @param enableHttp3 whether to enable experimental support for HTTP/3 (QUIC).
* @param enableGzip whether to enable response gzip decompression.
Expand Down Expand Up @@ -104,18 +106,19 @@ public enum TrustChainVerification {
* @param keyValueStores platform key-value store implementations.
*/
public EnvoyConfiguration(
Boolean adminInterfaceEnabled, String grpcStatsDomain, @Nullable Integer statsdPort,
boolean adminInterfaceEnabled, String grpcStatsDomain, @Nullable Integer statsdPort,
int connectTimeoutSeconds, int dnsRefreshSeconds, int dnsFailureRefreshSecondsBase,
int dnsFailureRefreshSecondsMax, int dnsQueryTimeoutSeconds, int dnsMinRefreshSeconds,
String dnsPreresolveHostnames, List<String> dnsFallbackNameservers,
Boolean dnsFilterUnroutableFamilies, boolean enableDrainPostDnsRefresh, boolean enableHttp3,
boolean enableGzip, boolean enableBrotli, boolean enableHappyEyeballs,
boolean enableInterfaceBinding, boolean forceIPv6,
int h2ConnectionKeepaliveIdleIntervalMilliseconds, int h2ConnectionKeepaliveTimeoutSeconds,
boolean h2ExtendKeepaliveTimeout, List<String> h2RawDomains, int maxConnectionsPerHost,
int statsFlushSeconds, int streamIdleTimeoutSeconds, int perTryIdleTimeoutSeconds,
String appVersion, String appId, TrustChainVerification trustChainVerification,
String virtualClusters, List<EnvoyNativeFilterConfig> nativeFilterChain,
boolean dnsFilterUnroutableFamilies, boolean dnsUseSystemResolver,
boolean enableDrainPostDnsRefresh, boolean enableHttp3, boolean enableGzip,
boolean enableBrotli, boolean enableHappyEyeballs, boolean enableInterfaceBinding,
boolean forceIPv6, int h2ConnectionKeepaliveIdleIntervalMilliseconds,
int h2ConnectionKeepaliveTimeoutSeconds, boolean h2ExtendKeepaliveTimeout,
List<String> h2RawDomains, int maxConnectionsPerHost, int statsFlushSeconds,
int streamIdleTimeoutSeconds, int perTryIdleTimeoutSeconds, String appVersion, String appId,
TrustChainVerification trustChainVerification, String virtualClusters,
List<EnvoyNativeFilterConfig> nativeFilterChain,
List<EnvoyHTTPFilterFactory> httpPlatformFilterFactories,
Map<String, EnvoyStringAccessor> stringAccessors,
Map<String, EnvoyKeyValueStore> keyValueStores) {
Expand All @@ -131,6 +134,7 @@ public EnvoyConfiguration(
this.dnsPreresolveHostnames = dnsPreresolveHostnames;
this.dnsFallbackNameservers = dnsFallbackNameservers;
this.dnsFilterUnroutableFamilies = dnsFilterUnroutableFamilies;
this.dnsUseSystemResolver = dnsUseSystemResolver;
this.enableDrainPostDnsRefresh = enableDrainPostDnsRefresh;
this.enableHttp3 = enableHttp3;
this.enableGzip = enableGzip;
Expand Down Expand Up @@ -228,10 +232,19 @@ String resolveTemplate(final String configTemplate, final String platformFilterT
h2RawDomainsAsString = sb.toString();
}

String dnsResolverConfig = String.format(
"{\"@type\":\"type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig\",\"resolvers\":%s,\"use_resolvers_as_fallback\": %s, \"filter_unroutable_families\": %s}",
dnsFallbackNameserversAsString, !dnsFallbackNameservers.isEmpty() ? "true" : "false",
dnsFilterUnroutableFamilies ? "true" : "false");
String dnsResolverName = "";
String dnsResolverConfig = "";
if (dnsUseSystemResolver) {
dnsResolverName = "envoy.network.dns_resolver.getaddrinfo";
dnsResolverConfig =
"{\"@type\":\"type.googleapis.com/envoy.extensions.network.dns_resolver.getaddrinfo.v3.GetAddrInfoDnsResolverConfig\"}";
} else {
dnsResolverName = "envoy.network.dns_resolver.cares";
dnsResolverConfig = String.format(
"{\"@type\":\"type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig\",\"resolvers\":%s,\"use_resolvers_as_fallback\": %s, \"filter_unroutable_families\": %s}",
dnsFallbackNameserversAsString, !dnsFallbackNameservers.isEmpty() ? "true" : "false",
dnsFilterUnroutableFamilies ? "true" : "false");

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.

no action needed - just want to point out that for our new resolver dnsFilterUnroutableFamilies is effectively always equal to true as I pointed out in https://github.com/envoyproxy/envoy/pull/22080/files#r919203157.

Just something for future us - we will need to clean up all of the DNS flags/options that we expose.

}

StringBuilder configBuilder = new StringBuilder("!ignore platform_defs:\n");
configBuilder.append(String.format("- &connect_timeout %ss\n", connectTimeoutSeconds))
Expand All @@ -246,7 +259,7 @@ String resolveTemplate(final String configTemplate, final String platformFilterT
String.format("- &dns_multiple_addresses %s\n", enableHappyEyeballs ? "true" : "false"))
.append(String.format("- &h2_delay_keepalive_timeout %s\n",
h2ExtendKeepaliveTimeout ? "true" : "false"))
.append("- &dns_resolver_name envoy.network.dns_resolver.cares\n")
.append(String.format("- &dns_resolver_name %s\n", dnsResolverName))
.append(String.format("- &dns_refresh_rate %ss\n", dnsRefreshSeconds))
.append(String.format("- &dns_resolver_config %s\n", dnsResolverConfig))
.append(String.format("- &enable_drain_post_dns_refresh %s\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public class NativeCronetEngineBuilderImpl extends CronetEngineBuilderImpl {
private String mDnsPreresolveHostnames = "[]";
private List<String> mDnsFallbackNameservers = Collections.emptyList();
private boolean mEnableDnsFilterUnroutableFamilies = false;
private boolean mDnsUseSystemResolver = false;
private boolean mEnableDrainPostDnsRefresh = false;
private boolean mEnableHttp3 = false;
private boolean mEnableGzip = true;
Expand Down Expand Up @@ -107,12 +108,13 @@ private EnvoyConfiguration createEnvoyConfiguration() {
mAdminInterfaceEnabled, mGrpcStatsDomain, mStatsDPort, mConnectTimeoutSeconds,
mDnsRefreshSeconds, mDnsFailureRefreshSecondsBase, mDnsFailureRefreshSecondsMax,
mDnsQueryTimeoutSeconds, mDnsMinRefreshSeconds, mDnsPreresolveHostnames,
mDnsFallbackNameservers, mEnableDnsFilterUnroutableFamilies, mEnableDrainPostDnsRefresh,
mEnableHttp3, mEnableGzip, brotliEnabled(), mEnableHappyEyeballs, mEnableInterfaceBinding,
mForceIPv6, mH2ConnectionKeepaliveIdleIntervalMilliseconds,
mH2ConnectionKeepaliveTimeoutSeconds, mH2ExtendKeepaliveTimeout, mH2RawDomains,
mMaxConnectionsPerHost, mStatsFlushSeconds, mStreamIdleTimeoutSeconds,
mPerTryIdleTimeoutSeconds, mAppVersion, mAppId, mTrustChainVerification, mVirtualClusters,
nativeFilterChain, platformFilterChain, stringAccessors, keyValueStores);
mDnsFallbackNameservers, mEnableDnsFilterUnroutableFamilies, mDnsUseSystemResolver,
mEnableDrainPostDnsRefresh, mEnableHttp3, mEnableGzip, brotliEnabled(),
mEnableHappyEyeballs, mEnableInterfaceBinding, mForceIPv6,
mH2ConnectionKeepaliveIdleIntervalMilliseconds, mH2ConnectionKeepaliveTimeoutSeconds,
mH2ExtendKeepaliveTimeout, mH2RawDomains, mMaxConnectionsPerHost, mStatsFlushSeconds,
mStreamIdleTimeoutSeconds, mPerTryIdleTimeoutSeconds, mAppVersion, mAppId,
mTrustChainVerification, mVirtualClusters, nativeFilterChain, platformFilterChain,
stringAccessors, keyValueStores);
}
}
15 changes: 15 additions & 0 deletions library/kotlin/io/envoyproxy/envoymobile/EngineBuilder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ open class EngineBuilder(
private var dnsFailureRefreshSecondsMax = 10
private var dnsFallbackNameservers = listOf<String>()
private var dnsFilterUnroutableFamilies = true
private var dnsUseSystemResolver = false
private var dnsQueryTimeoutSeconds = 25
private var dnsMinRefreshSeconds = 60
private var dnsPreresolveHostnames = "[]"
Expand Down Expand Up @@ -218,6 +219,19 @@ open class EngineBuilder(
return this
}

/**
* Specify whether to use the getaddr-based system DNS resolver or the c-ares resolver.
Comment thread
jpsim marked this conversation as resolved.
Outdated
* Defaults to false.
Comment thread
jpsim marked this conversation as resolved.
*
* @param dnsUseSystemResolver whether to use the system DNS resolver.
*
* @return this builder.
*/
fun enableDNSUseSystemResolver(dnsUseSystemResolver: Boolean): EngineBuilder {
this.dnsUseSystemResolver = dnsUseSystemResolver
return this
}

/**
* Specify whether to drain connections after the resolution of a soft DNS refresh. A refresh may
* be triggered directly via the Engine API, or as a result of a network status update provided by
Expand Down Expand Up @@ -591,6 +605,7 @@ open class EngineBuilder(
dnsPreresolveHostnames,
dnsFallbackNameservers,
dnsFilterUnroutableFamilies,
dnsUseSystemResolver,
enableDrainPostDnsRefresh,
enableHttp3,
enableGzip,
Expand Down
13 changes: 13 additions & 0 deletions test/cc/unit/envoy_config_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,19 @@ TEST(TestConfig, ConfigIsValid) {
#endif
}

#if !defined(__APPLE__)
TEST(TestConfig, SetUseDnsSystemResolver) {
auto engine_builder = EngineBuilder();
engine_builder.useDnsSystemResolver(true);
auto config_str = engine_builder.generateConfigStr();
envoy::config::bootstrap::v3::Bootstrap bootstrap;
TestUtility::loadFromYaml(absl::StrCat(config_header, config_str), bootstrap);

ASSERT_THAT(bootstrap.DebugString(), HasSubstr("envoy.network.dns_resolver.getaddrinfo"));
ASSERT_THAT(bootstrap.DebugString(), Not(HasSubstr("envoy.network.dns_resolver.cares")));
}
#endif

TEST(TestConfig, SetGzip) {
auto engine_builder = EngineBuilder();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ class EnvoyConfigurationTest {
dnsPreresolveHostnames: String = "[hostname]",
dnsFallbackNameservers: List<String> = emptyList(),
enableDnsFilterUnroutableFamilies: Boolean = true,
dnsUseSystemResolver: Boolean = false,
enableDrainPostDnsRefresh: Boolean = false,
enableHttp3: Boolean = false,
enableGzip: Boolean = true,
Expand Down Expand Up @@ -87,6 +88,7 @@ class EnvoyConfigurationTest {
dnsPreresolveHostnames,
dnsFallbackNameservers,
enableDnsFilterUnroutableFamilies,
dnsUseSystemResolver,
enableDrainPostDnsRefresh,
enableHttp3,
enableGzip,
Expand Down Expand Up @@ -230,6 +232,20 @@ class EnvoyConfigurationTest {
assertThat(resolvedTemplate).contains("&force_ipv6 true")
}

@Test
fun `configuration resolves with system DNS resolver`() {
val envoyConfiguration = buildTestEnvoyConfiguration(
dnsUseSystemResolver = true
)

val resolvedTemplate = envoyConfiguration.resolveTemplate(
TEST_CONFIG, PLATFORM_FILTER_CONFIG, NATIVE_FILTER_CONFIG, APCF_INSERT, GZIP_INSERT, BROTLI_INSERT
)

assertThat(resolvedTemplate).contains("&dns_resolver_config {\"@type\":\"type.googleapis.com/envoy.extensions.network.dns_resolver.getaddrinfo.v3.GetAddrInfoDnsResolverConfig\"}")
assertThat(resolvedTemplate).contains("&dns_resolver_name envoy.network.dns_resolver.getaddrinfo")
}

@Test
fun `resolve templates with invalid templates will throw on build`() {
val envoyConfiguration = buildTestEnvoyConfiguration()
Expand Down
1 change: 1 addition & 0 deletions test/kotlin/apps/experimental/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class MainActivity : Activity() {
.addPlatformFilter(::AsyncDemoFilter)
.h2ExtendKeepaliveTimeout(true)
.enableInterfaceBinding(true)
.enableDNSUseSystemResolver(true)
.forceIPv6(true)
.addNativeFilter("envoy.filters.http.buffer", "{\"@type\":\"type.googleapis.com/envoy.extensions.filters.http.buffer.v3.Buffer\",\"max_request_bytes\":5242880}")
.addStringAccessor("demo-accessor", { "PlatformString" })
Expand Down