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 this.responseDecoder = new DnsResponseDecoder<InetSocketAddress>(recordDecoder) {
47 @Override
48 protected DnsResponse newResponse(InetSocketAddress sender, InetSocketAddress recipient,
49 int id, DnsOpCode opCode, DnsResponseCode responseCode) {
50 return new DatagramDnsResponse(sender, recipient, id, opCode, responseCode);
51 }
52 };
53 }
54
55 @Override
56 protected void decode(ChannelHandlerContext ctx, DatagramPacket packet, List<Object> out) throws Exception {
57 try {
58 out.add(decodeResponse(ctx, packet));
59 } catch (IndexOutOfBoundsException e) {
60 throw new CorruptedFrameException("Unable to decode response", e);
61 }
62 }
63
64 protected DnsResponse decodeResponse(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
65 return responseDecoder.decode(packet.sender(), packet.recipient(), packet.content());
66 }
67 }