1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.netty.resolver.dns;
18
19 import io.netty.channel.ChannelFactory;
20 import io.netty.channel.EventLoop;
21 import io.netty.channel.socket.DatagramChannel;
22 import io.netty.resolver.AddressResolver;
23 import io.netty.resolver.AddressResolverGroup;
24 import io.netty.resolver.InetSocketAddressResolver;
25 import io.netty.resolver.NameResolver;
26 import io.netty.util.concurrent.EventExecutor;
27 import io.netty.util.concurrent.Promise;
28 import io.netty.util.internal.StringUtil;
29
30 import java.net.InetAddress;
31 import java.net.InetSocketAddress;
32 import java.util.List;
33 import java.util.concurrent.ConcurrentHashMap;
34 import java.util.concurrent.ConcurrentMap;
35
36
37
38
39 public class DnsAddressResolverGroup extends AddressResolverGroup<InetSocketAddress> {
40
41 private final DnsNameResolverBuilder dnsResolverBuilder;
42
43 private final ConcurrentMap<String, Promise<InetAddress>> resolvesInProgress = new ConcurrentHashMap<>();
44 private final ConcurrentMap<String, Promise<List<InetAddress>>> resolveAllsInProgress = new ConcurrentHashMap<>();
45
46 public DnsAddressResolverGroup(DnsNameResolverBuilder dnsResolverBuilder) {
47 this.dnsResolverBuilder = withSharedCaches(dnsResolverBuilder.copy());
48 }
49
50 public DnsAddressResolverGroup(
51 Class<? extends DatagramChannel> channelType,
52 DnsServerAddressStreamProvider nameServerProvider) {
53 this.dnsResolverBuilder = withSharedCaches(new DnsNameResolverBuilder());
54 dnsResolverBuilder.datagramChannelType(channelType).nameServerProvider(nameServerProvider);
55 }
56
57 public DnsAddressResolverGroup(
58 ChannelFactory<? extends DatagramChannel> channelFactory,
59 DnsServerAddressStreamProvider nameServerProvider) {
60 this.dnsResolverBuilder = withSharedCaches(new DnsNameResolverBuilder());
61 dnsResolverBuilder.datagramChannelFactory(channelFactory).nameServerProvider(nameServerProvider);
62 }
63
64 private static DnsNameResolverBuilder withSharedCaches(DnsNameResolverBuilder dnsResolverBuilder) {
65
66
67 return dnsResolverBuilder.resolveCache(dnsResolverBuilder.getOrNewCache())
68 .cnameCache(dnsResolverBuilder.getOrNewCnameCache())
69 .authoritativeDnsServerCache(dnsResolverBuilder.getOrNewAuthoritativeDnsServerCache());
70 }
71
72 @SuppressWarnings("deprecation")
73 @Override
74 protected final AddressResolver<InetSocketAddress> newResolver(EventExecutor executor) throws Exception {
75 if (!(executor instanceof EventLoop)) {
76 throw new IllegalStateException(
77 "unsupported executor type: " + StringUtil.simpleClassName(executor) +
78 " (expected: " + StringUtil.simpleClassName(EventLoop.class));
79 }
80
81
82
83 EventLoop loop = dnsResolverBuilder.eventLoop;
84 return newResolver(loop == null ? (EventLoop) executor : loop,
85 dnsResolverBuilder.datagramChannelFactory(),
86 dnsResolverBuilder.nameServerProvider());
87 }
88
89
90
91
92 @Deprecated
93 protected AddressResolver<InetSocketAddress> newResolver(
94 EventLoop eventLoop, ChannelFactory<? extends DatagramChannel> channelFactory,
95 DnsServerAddressStreamProvider nameServerProvider) throws Exception {
96
97 final NameResolver<InetAddress> resolver = new InflightNameResolver<InetAddress>(
98 eventLoop,
99 newNameResolver(eventLoop, channelFactory, nameServerProvider),
100 resolvesInProgress,
101 resolveAllsInProgress);
102
103 return newAddressResolver(eventLoop, resolver);
104 }
105
106
107
108
109
110 protected NameResolver<InetAddress> newNameResolver(EventLoop eventLoop,
111 ChannelFactory<? extends DatagramChannel> channelFactory,
112 DnsServerAddressStreamProvider nameServerProvider)
113 throws Exception {
114 DnsNameResolverBuilder builder = dnsResolverBuilder.copy();
115
116
117
118 return builder.eventLoop(eventLoop)
119 .datagramChannelFactory(channelFactory)
120 .nameServerProvider(nameServerProvider)
121 .build();
122 }
123
124
125
126
127
128 protected AddressResolver<InetSocketAddress> newAddressResolver(EventLoop eventLoop,
129 NameResolver<InetAddress> resolver)
130 throws Exception {
131 return new InetSocketAddressResolver(eventLoop, resolver);
132 }
133 }