Skip to content

Commit 4219a5c

Browse files
committed
Backport Allow ndots=0, close AsyncHttpClient#1219
1 parent 8fb691e commit 4219a5c

File tree

4 files changed

+48
-13
lines changed

4 files changed

+48
-13
lines changed

netty-bp/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public DnsNameResolver(
190190
this.hostsFileEntriesResolver = checkNotNull(hostsFileEntriesResolver, "hostsFileEntriesResolver");
191191
this.resolveCache = resolveCache;
192192
this.searchDomains = checkNotNull(searchDomains, "searchDomains").clone();
193-
this.ndots = checkPositive(ndots, "ndots");
193+
this.ndots = checkPositiveOrZero(ndots, "ndots");
194194

195195
Bootstrap b = new Bootstrap();
196196
b.group(executor());

netty-bp/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolverBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ public DnsNameResolverBuilder searchDomains(Iterable<String> searchDomains) {
319319

320320
/**
321321
* Set the number of dots which must appear in a name before an initial absolute query is made.
322+
* The default value is {@code 1}.
322323
*
323324
* @param ndots the ndots value
324325
* @return {@code this}

netty-bp/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolverContext.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,18 @@ public void operationComplete(Future<T> future) throws Exception {
124124
}
125125
}
126126
});
127-
int dots = 0;
128-
for (int idx = hostname.length() - 1; idx >= 0; idx--) {
129-
if (hostname.charAt(idx) == '.' && ++dots >= parent.ndots()) {
130-
internalResolve(promise);
131-
return;
132-
}
133-
}
134-
promise.tryFailure(new UnknownHostException(hostname));
127+
if (parent.ndots() == 0) {
128+
internalResolve(promise);
129+
} else {
130+
int dots = 0;
131+
for (int idx = hostname.length() - 1; idx >= 0; idx--) {
132+
if (hostname.charAt(idx) == '.' && ++dots >= parent.ndots()) {
133+
internalResolve(promise);
134+
return;
135+
}
136+
}
137+
promise.tryFailure(new UnknownHostException(hostname));
138+
}
135139
}
136140
}
137141

netty-bp/resolver-dns/src/test/java/io/netty/resolver/dns/SearchDomainTest.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ private DnsNameResolverBuilder newResolver() {
4848

4949
private TestDnsServer dnsServer;
5050
private EventLoopGroup group;
51+
private DnsNameResolver resolver;
5152

5253
@Before
5354
public void before() {
@@ -60,6 +61,9 @@ public void destroy() {
6061
dnsServer.stop();
6162
dnsServer = null;
6263
}
64+
if (resolver != null) {
65+
resolver.close();
66+
}
6367
group.shutdownGracefully();
6468
}
6569

@@ -77,7 +81,7 @@ public void testResolve() throws Exception {
7781
dnsServer = new TestDnsServer(store);
7882
dnsServer.start();
7983

80-
DnsNameResolver resolver = newResolver().searchDomains(Collections.singletonList("foo.com")).build();
84+
resolver = newResolver().searchDomains(Collections.singletonList("foo.com")).build();
8185

8286
String a = "host1.foo.com";
8387
String resolved = assertResolve(resolver, a);
@@ -124,7 +128,7 @@ public void testResolveAll() throws Exception {
124128
dnsServer = new TestDnsServer(store);
125129
dnsServer.start();
126130

127-
DnsNameResolver resolver = newResolver().searchDomains(Collections.singletonList("foo.com")).build();
131+
resolver = newResolver().searchDomains(Collections.singletonList("foo.com")).build();
128132

129133
String a = "host1.foo.com";
130134
List<String> resolved = assertResolveAll(resolver, a);
@@ -169,7 +173,7 @@ public void testMultipleSearchDomain() throws Exception {
169173
dnsServer = new TestDnsServer(store);
170174
dnsServer.start();
171175

172-
DnsNameResolver resolver = newResolver().searchDomains(Arrays.asList("foo.com", "bar.com")).build();
176+
resolver = newResolver().searchDomains(Arrays.asList("foo.com", "bar.com")).build();
173177

174178
// "host1" resolves via the "foo.com" search path
175179
String resolved = assertResolve(resolver, "host1");
@@ -198,7 +202,7 @@ public void testSearchDomainWithNdots2() throws Exception {
198202
dnsServer = new TestDnsServer(store);
199203
dnsServer.start();
200204

201-
DnsNameResolver resolver = newResolver().searchDomains(Collections.singleton("foo.com")).ndots(2).build();
205+
resolver = newResolver().searchDomains(Collections.singleton("foo.com")).ndots(2).build();
202206

203207
String resolved = assertResolve(resolver, "host1.sub");
204208
assertEquals(store.getAddress("host1.sub.foo.com"), resolved);
@@ -208,6 +212,32 @@ public void testSearchDomainWithNdots2() throws Exception {
208212
assertEquals(store.getAddress("host2.sub.foo.com"), resolved);
209213
}
210214

215+
@Test
216+
public void testSearchDomainWithNdots0() throws Exception {
217+
Set<String> domains = new HashSet<String>();
218+
domains.add("host1");
219+
domains.add("host1.foo.com");
220+
domains.add("host2.foo.com");
221+
222+
TestDnsServer.MapRecordStoreA store = new TestDnsServer.MapRecordStoreA(domains);
223+
dnsServer = new TestDnsServer(store);
224+
dnsServer.start();
225+
226+
resolver = newResolver().searchDomains(Collections.singleton("foo.com")).ndots(0).build();
227+
228+
// "host1" resolves directly as ndots = 0
229+
String resolved = assertResolve(resolver, "host1");
230+
assertEquals(store.getAddress("host1"), resolved);
231+
232+
// "host1.foo.com" resolves to host1.foo
233+
resolved = assertResolve(resolver, "host1.foo.com");
234+
assertEquals(store.getAddress("host1.foo.com"), resolved);
235+
236+
// "host2" resolves to host2.foo.com with the foo.com search domain
237+
resolved = assertResolve(resolver, "host2");
238+
assertEquals(store.getAddress("host2.foo.com"), resolved);
239+
}
240+
211241
private void assertNotResolve(DnsNameResolver resolver, String inetHost) throws InterruptedException {
212242
Future<InetAddress> fut = resolver.resolve(inetHost);
213243
assertTrue(fut.await(10, TimeUnit.SECONDS));

0 commit comments

Comments
 (0)