Example usage for io.netty.handler.codec.dns DefaultDnsQuestion DefaultDnsQuestion

List of usage examples for io.netty.handler.codec.dns DefaultDnsQuestion DefaultDnsQuestion

Introduction

In this page you can find the example usage for io.netty.handler.codec.dns DefaultDnsQuestion DefaultDnsQuestion.

Prototype

public DefaultDnsQuestion(String name, DnsRecordType type, int dnsClass) 

Source Link

Document

Creates a new question.

Usage

From source file:io.vertx.core.dns.impl.DnsClientImpl.java

License:Open Source License

@SuppressWarnings("unchecked")
private <T> void lookup(String name, Future<List<T>> result, DnsRecordType... types) {
    Objects.requireNonNull(name, "no null name accepted");
    bootstrap.connect(dnsServer).addListener(new RetryChannelFutureListener(result) {
        @Override//  w w  w  .  j  a v a 2 s.c o  m
        public void onSuccess(ChannelFuture future) throws Exception {
            DatagramDnsQuery query = new DatagramDnsQuery(null, dnsServer,
                    ThreadLocalRandom.current().nextInt());
            for (DnsRecordType type : types) {
                query.addRecord(DnsSection.QUESTION, new DefaultDnsQuestion(name, type, DnsRecord.CLASS_IN));
            }
            future.channel().writeAndFlush(query).addListener(new RetryChannelFutureListener(result) {
                @Override
                public void onSuccess(ChannelFuture future) throws Exception {
                    future.channel().pipeline().addLast(new SimpleChannelInboundHandler<DnsResponse>() {
                        @Override
                        protected void channelRead0(ChannelHandlerContext ctx, DnsResponse msg)
                                throws Exception {
                            DnsResponseCode code = DnsResponseCode.valueOf(msg.code().intValue());

                            if (code == DnsResponseCode.NOERROR) {

                                int count = msg.count(DnsSection.ANSWER);

                                List<T> records = new ArrayList<>(count);
                                for (int idx = 0; idx < count; idx++) {
                                    DnsRecord a = msg.recordAt(DnsSection.ANSWER, idx);
                                    T record = RecordDecoder.decode(a);
                                    if (isRequestedType(a.type(), types)) {
                                        records.add(record);
                                    }
                                }

                                if (records.size() > 0 && (records.get(0) instanceof MxRecordImpl
                                        || records.get(0) instanceof SrvRecordImpl)) {
                                    Collections.sort((List) records);
                                }

                                setResult(result, records);
                            } else {
                                setFailure(result, new DnsException(code));
                            }
                            ctx.close();
                        }

                        private boolean isRequestedType(DnsRecordType dnsRecordType, DnsRecordType[] types) {
                            for (DnsRecordType t : types) {
                                if (t.equals(dnsRecordType)) {
                                    return true;
                                }
                            }
                            return false;
                        }

                        @Override
                        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
                                throws Exception {
                            setFailure(result, cause);
                            ctx.close();
                        }
                    });
                }
            });
        }
    });
}