From 45bb8967f2b594657a4b567e5a42640cee86a136 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Thu, 16 Feb 2023 15:42:33 -0800 Subject: [PATCH] api: Target schema should be case insensitive URI schema are case-insensitive. Previously the code would do case-sensitive matching. We expect NameResolverProviders to return the typical canonical scheme formatting, which is lower-case. If a NameResolverProvider returns an unexpected string (upper case, unicode, etc), then it simply won't ever match. Channel users, however, can use either casing in target strings. The code implicitly already handled relative URIs by returning null, as Map.get(null) returned null. --- api/src/main/java/io/grpc/NameResolverProvider.java | 2 ++ api/src/main/java/io/grpc/NameResolverRegistry.java | 7 ++++++- api/src/test/java/io/grpc/NameResolverRegistryTest.java | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/io/grpc/NameResolverProvider.java b/api/src/main/java/io/grpc/NameResolverProvider.java index e7cddfc36d0..13cd750c36d 100644 --- a/api/src/main/java/io/grpc/NameResolverProvider.java +++ b/api/src/main/java/io/grpc/NameResolverProvider.java @@ -61,6 +61,8 @@ public abstract class NameResolverProvider extends NameResolver.Factory { * delegates to {@link Factory#getDefaultScheme()} before {@link NameResolver.Factory} is * deprecated in https://github.com/grpc/grpc-java/issues/7133. * + *

The scheme should be lower-case. + * * @since 1.40.0 * */ protected String getScheme() { diff --git a/api/src/main/java/io/grpc/NameResolverRegistry.java b/api/src/main/java/io/grpc/NameResolverRegistry.java index ab8a1e803eb..37dd9283297 100644 --- a/api/src/main/java/io/grpc/NameResolverRegistry.java +++ b/api/src/main/java/io/grpc/NameResolverRegistry.java @@ -26,6 +26,7 @@ import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; @@ -162,7 +163,11 @@ private final class NameResolverFactory extends NameResolver.Factory { @Override @Nullable public NameResolver newNameResolver(URI targetUri, NameResolver.Args args) { - NameResolverProvider provider = providers().get(targetUri.getScheme()); + String scheme = targetUri.getScheme(); + if (scheme == null) { + return null; + } + NameResolverProvider provider = providers().get(scheme.toLowerCase(Locale.US)); return provider == null ? null : provider.newNameResolver(targetUri, args); } diff --git a/api/src/test/java/io/grpc/NameResolverRegistryTest.java b/api/src/test/java/io/grpc/NameResolverRegistryTest.java index 55e43128109..19ae09520dd 100644 --- a/api/src/test/java/io/grpc/NameResolverRegistryTest.java +++ b/api/src/test/java/io/grpc/NameResolverRegistryTest.java @@ -183,8 +183,12 @@ public NameResolver newNameResolver(URI passedUri, NameResolver.Args passedArgs) }); assertThat(registry.asFactory().newNameResolver(uri, args)).isNull(); + assertThat(registry.asFactory().newNameResolver(URI.create("/0.0.0.0:80"), args)).isNull(); + assertThat(registry.asFactory().newNameResolver(URI.create("///0.0.0.0:80"), args)).isNull(); assertThat(registry.asFactory().newNameResolver(URI.create("other:///0.0.0.0:80"), args)) .isSameInstanceAs(nr); + assertThat(registry.asFactory().newNameResolver(URI.create("OTHER:///0.0.0.0:80"), args)) + .isSameInstanceAs(nr); assertThat(registry.asFactory().getDefaultScheme()).isEqualTo("dns"); }