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
24 import java.net.InetSocketAddress;
25 import java.util.List;
26
27
28
29
30 @ChannelHandler.Sharable
31 public class DatagramDnsResponseDecoder extends MessageToMessageDecoder<DatagramPacket> {
32
33 private final DnsResponseDecoder<InetSocketAddress> responseDecoder;
34
35
36
37
38 public DatagramDnsResponseDecoder() {
39 this(DnsRecordDecoder.DEFAULT);
40 }
41
42
43
44
45 public DatagramDnsResponseDecoder(DnsRecordDecoder recordDecoder) {
46 super(DatagramPacket.class);
47 this.responseDecoder = new DnsResponseDecoder<InetSocketAddress>(recordDecoder) {
48 @Override
49 protected DnsResponse newResponse(InetSocketAddress sender, InetSocketAddress recipient,
50 int id, DnsOpCode opCode, DnsResponseCode responseCode) {
51 return new DatagramDnsResponse(sender, recipient, id, opCode, responseCode);
52 }
53 };
54 }
55
56 @Override
57 protected void decode(ChannelHandlerContext ctx, DatagramPacket packet, List<Object> out) throws Exception {
58 try {
59 out.add(decodeResponse(ctx, packet));
60 } catch (IndexOutOfBoundsException e) {
61 throw new CorruptedFrameException("Unable to decode response", e);
62 }
63 }
64
65 protected DnsResponse decodeResponse(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
66 return responseDecoder.decode(packet.sender(), packet.recipient(), packet.content());
67 }
68 }