1 /*
2 * Copyright 2019 The Netty Project
3 *
4 * The Netty Project licenses this file to you under the Apache License,
5 * version 2.0 (the "License"); you may not use this file except in compliance
6 * with the License. You may obtain a copy of the License at:
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
16 package io.netty5.handler.codec.dns;
17
18 import io.netty5.buffer.api.Buffer;
19 import io.netty5.channel.ChannelHandlerContext;
20 import io.netty5.handler.codec.MessageToByteEncoder;
21 import io.netty5.util.internal.UnstableApi;
22
23 @UnstableApi
24 public final class TcpDnsQueryEncoder extends MessageToByteEncoder<DnsQuery> {
25
26 private final DnsQueryEncoder encoder;
27
28 /**
29 * Creates a new encoder with {@linkplain DnsRecordEncoder#DEFAULT the default record encoder}.
30 */
31 public TcpDnsQueryEncoder() {
32 this(DnsRecordEncoder.DEFAULT);
33 }
34
35 /**
36 * Creates a new encoder with the specified {@code recordEncoder}.
37 */
38 public TcpDnsQueryEncoder(DnsRecordEncoder recordEncoder) {
39 encoder = new DnsQueryEncoder(recordEncoder);
40 }
41
42 @Override
43 public boolean isSharable() {
44 return true;
45 }
46
47 @Override
48 protected void encode(ChannelHandlerContext ctx, DnsQuery msg, Buffer out) throws Exception {
49 // Length is two octets as defined by RFC-7766
50 // See https://tools.ietf.org/html/rfc7766#section-8
51 int initialOffset = out.writerOffset();
52 out.skipWritableBytes(2);
53 encoder.encode(msg, out);
54
55 // Now fill in the correct length based on the amount of data that we wrote the ByteBuf.
56 out.setShort(initialOffset, (short) (out.writerOffset() - initialOffset - 2));
57 }
58
59 @Override
60 protected Buffer allocateBuffer(ChannelHandlerContext ctx, @SuppressWarnings("unused") DnsQuery msg) {
61 return ctx.bufferAllocator().allocate(1024);
62 }
63 }