Skip to content

Commit f2c50b0

Browse files
committed
core: Add RFC 3986 support for 'dns' target URIs
# Conflicts: # core/src/test/java/io/grpc/internal/DnsNameResolverProviderTest.java
1 parent 91b3f83 commit f2c50b0

File tree

2 files changed

+57
-9
lines changed

2 files changed

+57
-9
lines changed

core/src/main/java/io/grpc/internal/DnsNameResolverProvider.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@
2020
import com.google.common.base.Stopwatch;
2121
import io.grpc.InternalServiceProviders;
2222
import io.grpc.NameResolver;
23+
import io.grpc.NameResolver.Args;
2324
import io.grpc.NameResolverProvider;
25+
import io.grpc.Uri;
2426
import java.net.InetSocketAddress;
2527
import java.net.SocketAddress;
2628
import java.net.URI;
2729
import java.util.Collection;
2830
import java.util.Collections;
31+
import java.util.List;
2932

3033
/**
3134
* A provider for {@link DnsNameResolver}.
@@ -54,6 +57,7 @@ public final class DnsNameResolverProvider extends NameResolverProvider {
5457

5558
@Override
5659
public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) {
60+
// TODO(jdcormie): Remove once RFC 3986 migration is complete.
5761
if (SCHEME.equals(targetUri.getScheme())) {
5862
String targetPath = Preconditions.checkNotNull(targetUri.getPath(), "targetPath");
5963
Preconditions.checkArgument(targetPath.startsWith("/"),
@@ -71,6 +75,25 @@ public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) {
7175
}
7276
}
7377

78+
@Override
79+
public NameResolver newNameResolver(Uri targetUri, final Args args) {
80+
if (SCHEME.equals(targetUri.getScheme())) {
81+
List<String> pathSegments = targetUri.getPathSegments();
82+
Preconditions.checkArgument(!pathSegments.isEmpty(),
83+
"expected 1 path segment in target %s but found %s", targetUri, pathSegments);
84+
String domainNameToResolve = pathSegments.get(0);
85+
return new DnsNameResolver(
86+
targetUri.getAuthority(),
87+
domainNameToResolve,
88+
args,
89+
GrpcUtil.SHARED_CHANNEL_EXECUTOR,
90+
Stopwatch.createUnstarted(),
91+
IS_ANDROID);
92+
} else {
93+
return null;
94+
}
95+
}
96+
7497
@Override
7598
public String getDefaultScheme() {
7699
return SCHEME;

core/src/test/java/io/grpc/internal/DnsNameResolverProviderTest.java

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,35 @@
1717
package io.grpc.internal;
1818

1919
import static com.google.common.truth.Truth.assertThat;
20+
import static com.google.common.truth.TruthJUnit.assume;
2021
import static org.junit.Assert.assertTrue;
2122
import static org.mockito.Mockito.mock;
2223

2324
import io.grpc.ChannelLogger;
2425
import io.grpc.NameResolver;
2526
import io.grpc.NameResolver.ServiceConfigParser;
2627
import io.grpc.SynchronizationContext;
28+
import io.grpc.Uri;
2729
import java.net.URI;
30+
import java.util.Arrays;
2831
import org.junit.Test;
2932
import org.junit.runner.RunWith;
30-
import org.junit.runners.JUnit4;
33+
import org.junit.runners.Parameterized;
34+
import org.junit.runners.Parameterized.Parameter;
35+
import org.junit.runners.Parameterized.Parameters;
3136

3237
/** Unit tests for {@link DnsNameResolverProvider}. */
33-
@RunWith(JUnit4.class)
38+
@RunWith(Parameterized.class)
3439
public class DnsNameResolverProviderTest {
3540
private final FakeClock fakeClock = new FakeClock();
3641

42+
@Parameters(name = "enableRfc3986UrisParam={0}")
43+
public static Iterable<Object[]> data() {
44+
return Arrays.asList(new Object[][] {{true}, {false}});
45+
}
46+
47+
@Parameter public boolean enableRfc3986UrisParam;
48+
3749
private final SynchronizationContext syncContext = new SynchronizationContext(
3850
new Thread.UncaughtExceptionHandler() {
3951
@Override
@@ -59,34 +71,47 @@ public void isAvailable() {
5971

6072
@Test
6173
public void newNameResolver_acceptsHostAndPort() {
62-
NameResolver nameResolver = provider.newNameResolver(URI.create("dns:///localhost:443"), args);
74+
DnsNameResolver nameResolver = newNameResolver("dns:///localhost:443", args);
75+
assertThat(nameResolver).isNotNull();
76+
assertThat(nameResolver.getClass()).isSameInstanceAs(DnsNameResolver.class);
77+
assertThat(nameResolver.getServiceAuthority()).isEqualTo("localhost:443");
78+
}
79+
80+
@Test
81+
public void newNameResolver_acceptsRootless() {
82+
assume().that(enableRfc3986UrisParam).isTrue();
83+
DnsNameResolver nameResolver = newNameResolver("dns:localhost:443", args);
6384
assertThat(nameResolver).isNotNull();
6485
assertThat(nameResolver.getClass()).isSameInstanceAs(DnsNameResolver.class);
6586
assertThat(nameResolver.getServiceAuthority()).isEqualTo("localhost:443");
6687
}
6788

6889
@Test
6990
public void newNameResolver_rejectsNonDnsScheme() {
70-
NameResolver nameResolver =
71-
provider.newNameResolver(URI.create("notdns:///localhost:443"), args);
91+
DnsNameResolver nameResolver = newNameResolver("notdns:///localhost:443", args);
7292
assertThat(nameResolver).isNull();
7393
}
7494

7595
@Test
7696
public void newNameResolver_toleratesTrailingPathSegments() {
77-
NameResolver nameResolver =
78-
provider.newNameResolver(URI.create("dns:///foo.googleapis.com/ig/nor/ed"), args);
97+
DnsNameResolver nameResolver = newNameResolver("dns:///foo.googleapis.com/ig/nor/ed", args);
7998
assertThat(nameResolver).isNotNull();
8099
assertThat(nameResolver.getClass()).isSameInstanceAs(DnsNameResolver.class);
81100
assertThat(nameResolver.getServiceAuthority()).isEqualTo("foo.googleapis.com");
82101
}
83102

84103
@Test
85104
public void newNameResolver_toleratesAuthority() {
86-
NameResolver nameResolver =
87-
provider.newNameResolver(URI.create("dns://8.8.8.8/foo.googleapis.com"), args);
105+
DnsNameResolver nameResolver = newNameResolver("dns://8.8.8.8/foo.googleapis.com", args);
88106
assertThat(nameResolver).isNotNull();
89107
assertThat(nameResolver.getClass()).isSameInstanceAs(DnsNameResolver.class);
90108
assertThat(nameResolver.getServiceAuthority()).isEqualTo("foo.googleapis.com");
91109
}
110+
111+
private DnsNameResolver newNameResolver(String uriString, NameResolver.Args args) {
112+
return (DnsNameResolver)
113+
(enableRfc3986UrisParam
114+
? provider.newNameResolver(Uri.create(uriString), args)
115+
: provider.newNameResolver(URI.create(uriString), args));
116+
}
92117
}

0 commit comments

Comments
 (0)