Home / Class/ TestDnsProtocolUdpCodecFactory Class — netty Architecture

TestDnsProtocolUdpCodecFactory Class — netty Architecture

Architecture documentation for the TestDnsProtocolUdpCodecFactory class in TestDnsServer.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  46c35087_32cd_5c67_6e42_ca3ad96d5f51["TestDnsProtocolUdpCodecFactory"]
  671a7057_027f_0237_34ae_461bd20152cd["TestDnsServer.java"]
  46c35087_32cd_5c67_6e42_ca3ad96d5f51 -->|defined in| 671a7057_027f_0237_34ae_461bd20152cd
  6b3f6b6d_f236_cc74_572f_03587eb4e906["TestDnsProtocolUdpCodecFactory()"]
  46c35087_32cd_5c67_6e42_ca3ad96d5f51 -->|method| 6b3f6b6d_f236_cc74_572f_03587eb4e906
  56f26f02_7b3e_ca8c_d994_426f7876088b["ProtocolEncoder()"]
  46c35087_32cd_5c67_6e42_ca3ad96d5f51 -->|method| 56f26f02_7b3e_ca8c_d994_426f7876088b
  3d7e226c_17fa_6c68_7d1d_52a3348a5132["encodeAAAA()"]
  46c35087_32cd_5c67_6e42_ca3ad96d5f51 -->|method| 3d7e226c_17fa_6c68_7d1d_52a3348a5132
  f69c4737_5b67_f746_e057_af2242bb0f3f["ProtocolDecoder()"]
  46c35087_32cd_5c67_6e42_ca3ad96d5f51 -->|method| f69c4737_5b67_f746_e057_af2242bb0f3f

Relationship Graph

Source Code

resolver-dns/src/test/java/io/netty/resolver/dns/TestDnsServer.java lines 156–236

    private final class TestDnsProtocolUdpCodecFactory implements ProtocolCodecFactory {
        private final DnsMessageEncoder encoder = new DnsMessageEncoder();
        private final TestAAAARecordEncoder recordEncoder = new TestAAAARecordEncoder();
        private final RecordType dropRecordType;

        TestDnsProtocolUdpCodecFactory(RecordType dropRecordType) {
            this.dropRecordType = dropRecordType;
        }

        @Override
        public ProtocolEncoder getEncoder(IoSession session) {
            return new DnsUdpEncoder() {

                @Override
                public void encode(IoSession session, Object message, ProtocolEncoderOutput out) {
                    IoBuffer buf = IoBuffer.allocate(4096);
                    DnsMessage dnsMessage = filterMessage((DnsMessage) message);
                    if (dnsMessage != null) {
                        encoder.encode(buf, dnsMessage);

                        encodeAAAA(dnsMessage.getAnswerRecords(), buf);
                        encodeAAAA(dnsMessage.getAuthorityRecords(), buf);
                        encodeAAAA(dnsMessage.getAdditionalRecords(), buf);
                        buf.flip();

                        out.write(buf);
                    }
                }
            };
        }

        private void encodeAAAA(List<ResourceRecord> records, IoBuffer out) {
            for (ResourceRecord record : records) {
                // This is a hack to allow to also test for AAAA resolution as DnsMessageEncoder
                // does not support it and it is hard to extend, because the interesting methods
                // are private...
                // In case of RecordType.AAAA we need to encode the RecordType by ourselves.
                if (record.getRecordType() == RecordType.AAAA) {
                    try {
                        recordEncoder.put(out, record);
                    } catch (IOException e) {
                        // Should never happen
                        throw new IllegalStateException(e);
                    }
                }
            }
        }

        @Override
        public ProtocolDecoder getDecoder(IoSession session) {
            return new ProtocolDecoderAdapter() {
                private final DnsMessageDecoder decoder = new DnsMessageDecoder();

                @Override
                public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws IOException {
                    DnsMessage message = decoder.decode(in);
                    if (dropRecordType != null) {
                        for (QuestionRecord record: message.getQuestionRecords()) {
                            if (record.getRecordType() == dropRecordType) {
                                return;
                            }
                        }
                    }
                    out.write(message);
                }
            };
        }

        private final class TestAAAARecordEncoder extends ResourceRecordEncoder {

            @Override
            protected void putResourceRecordData(IoBuffer ioBuffer, ResourceRecord resourceRecord) {
                byte[] bytes = BYTES.get(resourceRecord.get(DnsAttribute.IP_ADDRESS));
                if (bytes == null) {
                    throw new IllegalStateException(resourceRecord.get(DnsAttribute.IP_ADDRESS));
                }
                // encode the ::1
                ioBuffer.put(bytes);
            }
        }
    }

Frequently Asked Questions

What is the TestDnsProtocolUdpCodecFactory class?
TestDnsProtocolUdpCodecFactory is a class in the netty codebase, defined in resolver-dns/src/test/java/io/netty/resolver/dns/TestDnsServer.java.
Where is TestDnsProtocolUdpCodecFactory defined?
TestDnsProtocolUdpCodecFactory is defined in resolver-dns/src/test/java/io/netty/resolver/dns/TestDnsServer.java at line 156.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free