core: fix SRV record parsing

* only unquote TXT data, so as to not remove spaces from SRV data
This commit is contained in:
apolcyn 2018-06-04 18:59:15 -07:00 committed by Carl Mastrangelo
parent c796901aca
commit 6dbe3921ed
2 changed files with 27 additions and 10 deletions

View File

@ -586,7 +586,7 @@ final class DnsNameResolver extends NameResolver {
NamingEnumeration<?> rrValues = rrEntry.getAll(); NamingEnumeration<?> rrValues = rrEntry.getAll();
try { try {
while (rrValues.hasMore()) { while (rrValues.hasMore()) {
records.add(unquote(String.valueOf(rrValues.next()))); records.add(normalizeData(recordType, String.valueOf(rrValues.next())));
} }
} finally { } finally {
rrValues.close(); 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 @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) { static String unquote(String txtRecord) {
StringBuilder sb = new StringBuilder(txtRecord.length()); StringBuilder sb = new StringBuilder(txtRecord.length());
boolean inquote = false; boolean inquote = false;

View File

@ -281,14 +281,20 @@ public class DnsNameResolverTest {
} }
@Test @Test
public void unquoteRemovesJndiFormatting() { public void normalizeDataRemovesJndiFormattingForTxtRecords() {
assertEquals("blah", DnsNameResolver.unquote("blah")); assertEquals("blah", DnsNameResolver.normalizeData("TXT", "blah"));
assertEquals("", DnsNameResolver.unquote("\"\"")); assertEquals("", DnsNameResolver.normalizeData("TXT", "\"\""));
assertEquals("blahblah", DnsNameResolver.unquote("blah blah")); assertEquals("blahblah", DnsNameResolver.normalizeData("TXT", "blah blah"));
assertEquals("blahfoo blah", DnsNameResolver.unquote("blah \"foo blah\"")); assertEquals("blahfoo blah", DnsNameResolver.normalizeData("TXT", "blah \"foo blah\""));
assertEquals("blah blah", DnsNameResolver.unquote("\"blah blah\"")); assertEquals("blah blah", DnsNameResolver.normalizeData("TXT", "\"blah blah\""));
assertEquals("blah\"blah", DnsNameResolver.unquote("\"blah\\\"blah\"")); assertEquals("blah\"blah", DnsNameResolver.normalizeData("TXT", "\"blah\\\"blah\""));
assertEquals("blah\\blah", DnsNameResolver.unquote("\"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 @Test