Search in sources :

Example 6 with DnsRecord

use of io.netty.handler.codec.dns.DnsRecord in project vert.x by eclipse.

the class DnsClientImpl method lookup.

@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
        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();
                        }
                    });
                }
            });
        }
    });
}
Also used : ChannelFuture(io.netty.channel.ChannelFuture) DnsRecordType(io.netty.handler.codec.dns.DnsRecordType) ChannelHandlerContext(io.netty.channel.ChannelHandlerContext) DnsResponseCode(io.vertx.core.dns.DnsResponseCode) DnsException(io.vertx.core.dns.DnsException) UnknownHostException(java.net.UnknownHostException) DnsException(io.vertx.core.dns.DnsException) DatagramDnsQuery(io.netty.handler.codec.dns.DatagramDnsQuery) DnsResponse(io.netty.handler.codec.dns.DnsResponse) ArrayList(java.util.ArrayList) List(java.util.List) DnsRecord(io.netty.handler.codec.dns.DnsRecord) DefaultDnsQuestion(io.netty.handler.codec.dns.DefaultDnsQuestion)

Example 7 with DnsRecord

use of io.netty.handler.codec.dns.DnsRecord in project vert.x by eclipse.

the class RecordDecoder method decode.

/**
     * Decodes a resource record and returns the result.
     *
     * @param record
     * @return the decoded resource record
     */
@SuppressWarnings("unchecked")
public static <T> T decode(DnsRecord record) {
    DnsRecordType type = record.type();
    Function<DnsRecord, ?> decoder = decoders.get(type);
    if (decoder == null) {
        throw new IllegalStateException("Unsupported resource record type [id: " + type + "].");
    }
    T result = null;
    try {
        result = (T) decoder.apply(record);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}
Also used : DnsRecordType(io.netty.handler.codec.dns.DnsRecordType) DnsRecord(io.netty.handler.codec.dns.DnsRecord) DecoderException(io.netty.handler.codec.DecoderException) UnknownHostException(java.net.UnknownHostException)

Example 8 with DnsRecord

use of io.netty.handler.codec.dns.DnsRecord in project netty by netty.

the class DnsNameResolverContext method buildAliasMap.

private static Map<String, String> buildAliasMap(DnsResponse response) {
    final int answerCount = response.count(DnsSection.ANSWER);
    Map<String, String> cnames = null;
    for (int i = 0; i < answerCount; i++) {
        final DnsRecord r = response.recordAt(DnsSection.ANSWER, i);
        final DnsRecordType type = r.type();
        if (type != DnsRecordType.CNAME) {
            continue;
        }
        if (!(r instanceof DnsRawRecord)) {
            continue;
        }
        final ByteBuf recordContent = ((ByteBufHolder) r).content();
        final String domainName = decodeDomainName(recordContent);
        if (domainName == null) {
            continue;
        }
        if (cnames == null) {
            cnames = new HashMap<String, String>();
        }
        cnames.put(r.name().toLowerCase(Locale.US), domainName.toLowerCase(Locale.US));
    }
    return cnames != null ? cnames : Collections.<String, String>emptyMap();
}
Also used : DnsRawRecord(io.netty.handler.codec.dns.DnsRawRecord) ByteBufHolder(io.netty.buffer.ByteBufHolder) DnsRecordType(io.netty.handler.codec.dns.DnsRecordType) DnsRecord(io.netty.handler.codec.dns.DnsRecord) ByteBuf(io.netty.buffer.ByteBuf)

Aggregations

DnsRecord (io.netty.handler.codec.dns.DnsRecord)8 DnsRecordType (io.netty.handler.codec.dns.DnsRecordType)4 DnsResponse (io.netty.handler.codec.dns.DnsResponse)4 ArrayList (java.util.ArrayList)4 InetSocketAddress (java.net.InetSocketAddress)3 UnknownHostException (java.net.UnknownHostException)3 ByteBuf (io.netty.buffer.ByteBuf)2 ByteBufHolder (io.netty.buffer.ByteBufHolder)2 DatagramDnsQuery (io.netty.handler.codec.dns.DatagramDnsQuery)2 InetAddress (java.net.InetAddress)2 AddressedEnvelope (io.netty.channel.AddressedEnvelope)1 ChannelFuture (io.netty.channel.ChannelFuture)1 ChannelHandlerContext (io.netty.channel.ChannelHandlerContext)1 DecoderException (io.netty.handler.codec.DecoderException)1 DefaultDnsQuestion (io.netty.handler.codec.dns.DefaultDnsQuestion)1 DnsQuestion (io.netty.handler.codec.dns.DnsQuestion)1 DnsRawRecord (io.netty.handler.codec.dns.DnsRawRecord)1 Future (io.netty.util.concurrent.Future)1 DnsException (io.vertx.core.dns.DnsException)1 DnsResponseCode (io.vertx.core.dns.DnsResponseCode)1