1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.resolver.dns;
17
18 import io.netty.util.internal.SocketUtils;
19 import io.netty.util.internal.logging.InternalLogger;
20 import io.netty.util.internal.logging.InternalLoggerFactory;
21
22 import javax.naming.Context;
23 import javax.naming.directory.DirContext;
24 import javax.naming.directory.InitialDirContext;
25 import java.net.InetSocketAddress;
26 import java.net.URI;
27 import java.net.URISyntaxException;
28 import java.util.Hashtable;
29 import java.util.List;
30
31 final class DirContextUtils {
32 private static final InternalLogger logger =
33 InternalLoggerFactory.getInstance(DirContextUtils.class);
34
35 private DirContextUtils() { }
36
37 static void addNameServers(List<InetSocketAddress> defaultNameServers, int defaultPort) {
38
39
40
41
42
43 Hashtable<String, String> env = new Hashtable<String, String>();
44 env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
45 env.put("java.naming.provider.url", "dns://");
46
47 try {
48 DirContext ctx = new InitialDirContext(env);
49 String dnsUrls = (String) ctx.getEnvironment().get("java.naming.provider.url");
50
51 if (dnsUrls != null && !dnsUrls.isEmpty()) {
52 String[] servers = dnsUrls.split(" ");
53 for (String server : servers) {
54 try {
55 URI uri = new URI(server);
56 String host = uri.getHost();
57 if (host == null || host.isEmpty()) {
58 logger.debug(
59 "Skipping a nameserver URI as host portion could not be extracted: {}", server);
60
61 continue;
62 }
63 int port = uri.getPort();
64 defaultNameServers.add(SocketUtils.socketAddress(uri.getHost(), port == -1 ?
65 defaultPort : port));
66 } catch (URISyntaxException e) {
67 logger.debug("Skipping a malformed nameserver URI: {}", server, e);
68 }
69 }
70 }
71 } catch (Exception ex) {
72
73 logger.debug("Unable to obtain nameservers via InitialDirContext", ex);
74 }
75 }
76 }