diff options
Diffstat (limited to 'core/src/main/java/io/grpc')
-rw-r--r-- | core/src/main/java/io/grpc/internal/DnsNameResolver.java | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/core/src/main/java/io/grpc/internal/DnsNameResolver.java b/core/src/main/java/io/grpc/internal/DnsNameResolver.java index ccbce27db..dfa815525 100644 --- a/core/src/main/java/io/grpc/internal/DnsNameResolver.java +++ b/core/src/main/java/io/grpc/internal/DnsNameResolver.java @@ -86,6 +86,8 @@ final class DnsNameResolver extends NameResolver { private static final String JNDI_PROPERTY = System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_jndi", "true"); + private static final String JNDI_LOCALHOST_PROPERTY = + System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_jndi_localhost", "false"); private static final String JNDI_SRV_PROPERTY = System.getProperty("io.grpc.internal.DnsNameResolverProvider.enable_grpclb", "false"); private static final String JNDI_TXT_PROPERTY = @@ -107,6 +109,8 @@ final class DnsNameResolver extends NameResolver { @VisibleForTesting static boolean enableJndi = Boolean.parseBoolean(JNDI_PROPERTY); @VisibleForTesting + static boolean enableJndiLocalhost = Boolean.parseBoolean(JNDI_LOCALHOST_PROPERTY); + @VisibleForTesting static boolean enableSrv = Boolean.parseBoolean(JNDI_SRV_PROPERTY); @VisibleForTesting static boolean enableTxt = Boolean.parseBoolean(JNDI_TXT_PROPERTY); @@ -230,7 +234,7 @@ final class DnsNameResolver extends NameResolver { ResolutionResults resolutionResults; try { ResourceResolver resourceResolver = null; - if (enableJndi) { + if (shouldUseJndi(enableJndi, enableJndiLocalhost, host)) { resourceResolver = getResourceResolver(); } resolutionResults = @@ -629,4 +633,28 @@ final class DnsNameResolver extends NameResolver { } return localHostname; } + + @VisibleForTesting + static boolean shouldUseJndi(boolean jndiEnabled, boolean jndiLocalhostEnabled, String target) { + if (!jndiEnabled) { + return false; + } + if ("localhost".equalsIgnoreCase(target)) { + return jndiLocalhostEnabled; + } + // Check if this name looks like IPv6 + if (target.contains(":")) { + return false; + } + // Check if this might be IPv4. Such addresses have no alphabetic characters. This also + // checks the target is empty. + boolean alldigits = true; + for (int i = 0; i < target.length(); i++) { + char c = target.charAt(i); + if (c != '.') { + alldigits &= (c >= '0' && c <= '9'); + } + } + return !alldigits; + } } |