Skip to content

Commit

Permalink
[Android] Replace uses of StringJoiner with StringBuilder (#2098)
Browse files Browse the repository at this point in the history
Description: [StringJoiner](https://developer.android.com/reference/java/util/StringJoiner) was added in Android API level 24 but we still support back to API level 21, so this results in `NoClassDefFoundError` errors on devices running older Android versions.

Risk Level: Medium, this code is simple and unit tested.
Testing: Existing unit tests
Docs Changes: None
Release Notes: Added

Signed-off-by: JP Simard <jp@jpsim.com>
  • Loading branch information
jpsim committed Nov 29, 2022
1 parent c724ef6 commit 62347c7
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 7 deletions.
3 changes: 3 additions & 0 deletions mobile/docs/root/intro/version_history.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ Pending Release

Bugfixes:

- Android: Fix `NoClassDefFoundError` errors when using `addDNSFallbackNameservers`
or `addH2RawDomains` with Android versions older than API level 24.

Features:

- API: added Envoy's response flags to final stream intel (:issue:`#2009 <2009>`)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import java.util.Map;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.StringJoiner;
import java.lang.StringBuilder;
import javax.annotation.Nullable;

import io.envoyproxy.envoymobile.engine.types.EnvoyHTTPFilterFactory;
Expand Down Expand Up @@ -160,20 +160,28 @@ String resolveTemplate(final String templateYAML, final String platformFilterTem

String dnsFallbackNameserversAsString = "[]";
if (!dnsFallbackNameservers.isEmpty()) {
StringJoiner sj = new StringJoiner(",", "[", "]");
StringBuilder sb = new StringBuilder("[");
String separator = "";
for (String nameserver : dnsFallbackNameservers) {
sj.add(String.format("{\"socket_address\":{\"address\":\"%s\"}}", nameserver));
sb.append(separator);
separator = ",";
sb.append(String.format("{\"socket_address\":{\"address\":\"%s\"}}", nameserver));
}
dnsFallbackNameserversAsString = sj.toString();
sb.append("]");
dnsFallbackNameserversAsString = sb.toString();
}

String h2RawDomainsAsString = "[]";
if (!h2RawDomains.isEmpty()) {
StringJoiner sj = new StringJoiner(",", "[", "]");
StringBuilder sb = new StringBuilder("[");
String separator = "";
for (String hostname : h2RawDomains) {
sj.add(String.format("\"%s\"", hostname));
sb.append(separator);
separator = ",";
sb.append(String.format("\"%s\"", hostname));
}
h2RawDomainsAsString = sj.toString();
sb.append("]");
h2RawDomainsAsString = sb.toString();
}

String dnsResolverConfig = String.format(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,4 +139,36 @@ class EnvoyConfigurationTest {
assertThat(e.message).contains("cannot enable both statsD and gRPC metrics sink")
}
}

@Test
fun `resolving multiple h2 raw domains`() {
val envoyConfiguration = EnvoyConfiguration(
false, "stats.foo.com", null, 123, 234, 345, 456, 321, "[hostname]", listOf("8.8.8.8"), true,
true, true, 222, 333, listOf("h2-raw.domain", "h2-raw.domain2"), 567, 678, 910, "v1.2.3", "com.mydomain.myapp",
TrustChainVerification.ACCEPT_UNTRUSTED, "[test]",
listOf(EnvoyNativeFilterConfig("filter_name", "test_config")), emptyList(), emptyMap()
)

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

assertThat(resolvedTemplate).contains("&h2_raw_domains [\"h2-raw.domain\",\"h2-raw.domain2\"]")
}

@Test
fun `resolving multiple dns fallback nameservers`() {
val envoyConfiguration = EnvoyConfiguration(
false, "stats.foo.com", null, 123, 234, 345, 456, 321, "[hostname]", listOf("8.8.8.8", "1.1.1.1"), true,
true, true, 222, 333, listOf("h2-raw.domain", "h2-raw.domain2"), 567, 678, 910, "v1.2.3", "com.mydomain.myapp",
TrustChainVerification.ACCEPT_UNTRUSTED, "[test]",
listOf(EnvoyNativeFilterConfig("filter_name", "test_config")), emptyList(), emptyMap()
)

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

assertThat(resolvedTemplate).contains("&dns_resolver_config {\"@type\":\"type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig\",\"resolvers\":[{\"socket_address\":{\"address\":\"8.8.8.8\"}},{\"socket_address\":{\"address\":\"1.1.1.1\"}}],\"use_resolvers_as_fallback\": true, \"filter_unroutable_families\": true}")
}
}

0 comments on commit 62347c7

Please sign in to comment.