From 6dbe3921edd09553b5d87cc39eef485cb004d245 Mon Sep 17 00:00:00 2001 From: apolcyn Date: Mon, 4 Jun 2018 18:59:15 -0700 Subject: [PATCH] core: fix SRV record parsing * only unquote TXT data, so as to not remove spaces from SRV data --- .../io/grpc/internal/DnsNameResolver.java | 15 +++++++++++-- .../io/grpc/internal/DnsNameResolverTest.java | 22 ++++++++++++------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/DnsNameResolver.java b/core/src/main/java/io/grpc/internal/DnsNameResolver.java index a16f8b5453..0c8ce689ee 100644 --- a/core/src/main/java/io/grpc/internal/DnsNameResolver.java +++ b/core/src/main/java/io/grpc/internal/DnsNameResolver.java @@ -586,7 +586,7 @@ final class DnsNameResolver extends NameResolver { NamingEnumeration rrValues = rrEntry.getAll(); try { while (rrValues.hasMore()) { - records.add(unquote(String.valueOf(rrValues.next()))); + records.add(normalizeData(recordType, String.valueOf(rrValues.next()))); } } finally { rrValues.close(); @@ -600,9 +600,20 @@ final class DnsNameResolver extends NameResolver { } /** - * Undo the quoting done in {@link com.sun.jndi.dns.ResourceRecord#decodeTxt}. + * Convert returned RR data to a form that's consumable by the grpc library. */ @VisibleForTesting + static String normalizeData(String recordType, String rrData) { + String normalized = rrData; + if (recordType.equals("TXT")) { + normalized = unquote(normalized); + } + return normalized; + } + + /** + * Undo the quoting done in {@link com.sun.jndi.dns.ResourceRecord#decodeTxt}. + */ static String unquote(String txtRecord) { StringBuilder sb = new StringBuilder(txtRecord.length()); boolean inquote = false; diff --git a/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java b/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java index 9124dab464..97de00801e 100644 --- a/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java +++ b/core/src/test/java/io/grpc/internal/DnsNameResolverTest.java @@ -281,14 +281,20 @@ public class DnsNameResolverTest { } @Test - public void unquoteRemovesJndiFormatting() { - assertEquals("blah", DnsNameResolver.unquote("blah")); - assertEquals("", DnsNameResolver.unquote("\"\"")); - assertEquals("blahblah", DnsNameResolver.unquote("blah blah")); - assertEquals("blahfoo blah", DnsNameResolver.unquote("blah \"foo blah\"")); - assertEquals("blah blah", DnsNameResolver.unquote("\"blah blah\"")); - assertEquals("blah\"blah", DnsNameResolver.unquote("\"blah\\\"blah\"")); - assertEquals("blah\\blah", DnsNameResolver.unquote("\"blah\\\\blah\"")); + public void normalizeDataRemovesJndiFormattingForTxtRecords() { + assertEquals("blah", DnsNameResolver.normalizeData("TXT", "blah")); + assertEquals("", DnsNameResolver.normalizeData("TXT", "\"\"")); + assertEquals("blahblah", DnsNameResolver.normalizeData("TXT", "blah blah")); + assertEquals("blahfoo blah", DnsNameResolver.normalizeData("TXT", "blah \"foo blah\"")); + assertEquals("blah blah", DnsNameResolver.normalizeData("TXT", "\"blah blah\"")); + assertEquals("blah\"blah", DnsNameResolver.normalizeData("TXT", "\"blah\\\"blah\"")); + assertEquals("blah\\blah", DnsNameResolver.normalizeData("TXT", "\"blah\\\\blah\"")); + } + + @Test + public void normalizeDataLeavesSrvRecordsUnModified() { + assertEquals("0 0 1234 foo.bar.com", DnsNameResolver.normalizeData( + "SRV", "0 0 1234 foo.bar.com")); } @Test