1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.dns;
17
18 import io.netty.channel.ChannelHandler;
19 import io.netty.channel.ChannelHandlerContext;
20 import io.netty.channel.socket.DatagramPacket;
21 import io.netty.handler.codec.CorruptedFrameException;
22 import io.netty.handler.codec.MessageToMessageDecoder;
23 import io.netty.util.internal.UnstableApi;
24
25 import java.net.InetSocketAddress;
26 import java.util.List;
27
28
29
30
31 @UnstableApi
32 @ChannelHandler.Sharable
33 public class DatagramDnsResponseDecoder extends MessageToMessageDecoder<DatagramPacket> {
34
35 private final DnsResponseDecoder<InetSocketAddress> responseDecoder;
36
37
38
39
40 public DatagramDnsResponseDecoder() {
41 this(DnsRecordDecoder.DEFAULT);
42 }
43
44
45
46
47 public DatagramDnsResponseDecoder(DnsRecordDecoder recordDecoder) {
48 this.responseDecoder = new DnsResponseDecoder<InetSocketAddress>(recordDecoder) {
49 @Override
50 protected DnsResponse newResponse(InetSocketAddress sender, InetSocketAddress recipient,
51 int id, DnsOpCode opCode, DnsResponseCode responseCode) {
52 return new DatagramDnsResponse(sender, recipient, id, opCode, responseCode);
53 }
54 };
55 }
56
57 @Override
58 protected void decode(ChannelHandlerContext ctx, DatagramPacket packet, List<Object> out) throws Exception {
59 try {
60 out.add(decodeResponse(ctx, packet));
61 } catch (IndexOutOfBoundsException e) {
62 throw new CorruptedFrameException("Unable to decode response", e);
63 }
64 }
65
66 protected DnsResponse decodeResponse(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
67 return responseDecoder.decode(packet.sender(), packet.recipient(), packet.content());
68 }
69 }