src/jdk.dns.client/share/classes/jdk/dns/client/NetworkNamesResolver.java
author aefimov
Thu, 14 Nov 2019 23:16:40 +0000
branchaefimov-dns-client-branch
changeset 59101 258033faefc9
parent 58984 15e026239a6c
permissions -rw-r--r--
aefimov-dns-client-branch: Fix timeouts, add platform specific file locations
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
     1
/*
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
     4
 *
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    10
 *
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    15
 * accompanied this code).
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    16
 *
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    20
 *
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    23
 * questions.
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    24
 */
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    25
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    26
package jdk.dns.client;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    27
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    28
import jdk.dns.client.ex.DnsResolverException;
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    29
import jdk.dns.client.internal.AddressResolutionQueue;
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    30
import jdk.dns.client.internal.DnsResolver;
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    31
import jdk.dns.client.internal.HostsFileResolver;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    32
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    33
import java.net.InetAddress;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    34
import java.net.ProtocolFamily;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    35
import java.net.UnknownHostException;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    36
import java.security.PrivilegedAction;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    37
import java.util.List;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    38
import java.util.stream.Collectors;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    39
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    40
public class NetworkNamesResolver {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    41
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    42
    private final ProtocolFamily protocolFamily;
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    43
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    44
    public static NetworkNamesResolver open() throws UnknownHostException {
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    45
        // null for any (IPv4+IPv6) addresses family
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    46
        return new NetworkNamesResolver(null);
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    47
    }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    48
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    49
    public static NetworkNamesResolver open(ProtocolFamily protocolFamily) throws UnknownHostException {
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    50
        return new NetworkNamesResolver(protocolFamily);
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    51
    }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    52
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    53
    private NetworkNamesResolver(ProtocolFamily protocolFamily) throws UnknownHostException {
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    54
        this.protocolFamily = protocolFamily;
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    55
    }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    56
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    57
    /**
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    58
     * Lookup the IP address of a host.
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    59
     * The family of required address needed can be specified with {@code addressFamily} parameter.
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    60
     *
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    61
     * @param hostname the specified host name
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    62
     * @return first IP address that matches requested {@code addressFamily}
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    63
     * @throws UnknownHostException if no IP address found for the specified host name and the specified address family
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    64
     */
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    65
    public InetAddress lookupHostAddr(String hostname) throws UnknownHostException {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    66
        // First try hosts file
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    67
        // TODO: Add nsswitch.conf to select proper order
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    68
        try {
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    69
            return hostsFileResolver.getHostAddress(hostname, protocolFamily);
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    70
        } catch (UnknownHostException uhe) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    71
            if (DEBUG) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    72
                System.err.printf("Hosts file doesn't know '%s' host with '%s' address family%n",
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    73
                        hostname, protocolFamily == null ? "ANY" : protocolFamily.toString());
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    74
            }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    75
        }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    76
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    77
        // If no luck - try to ask name servers
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    78
        try (DnsResolver dnsResolver = new DnsResolver()) {
58984
15e026239a6c aefimov-dns-client-branch: Add system property to control ANY requests
aefimov
parents: 58971
diff changeset
    79
            var results = lookup(dnsResolver, hostname, protocolFamily, false);
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    80
            return results.get(0);
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    81
        }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    82
    }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    83
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    84
    /**
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    85
     * <p>Lookup a host mapping by name. Retrieve the IP addresses
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    86
     * associated with a host.
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    87
     *
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    88
     * @param hostname the specified hostname
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    89
     * @return array of IP addresses for the requested host
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    90
     * @throws UnknownHostException if no IP address for the {@code hostname} could be found
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    91
     */
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    92
    public List<InetAddress> lookupAllHostAddr(String hostname) throws UnknownHostException {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    93
        // First try hosts file
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    94
        // TODO: Add nsswitch.conf ReloadTracker and parser to select proper order
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    95
        try {
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
    96
            return List.of(hostsFileResolver.getHostAddress(hostname, protocolFamily));
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    97
        } catch (UnknownHostException uhe) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    98
            if (DEBUG) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
    99
                System.err.printf("Resolver API: Hosts file doesn't know '%s' host%n", hostname);
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   100
            }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   101
        }
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   102
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   103
        try (var dnsResolver = new DnsResolver()) {
58984
15e026239a6c aefimov-dns-client-branch: Add system property to control ANY requests
aefimov
parents: 58971
diff changeset
   104
            var results = lookup(dnsResolver, hostname, null, true);
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   105
            if (results.isEmpty()) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   106
                throw new UnknownHostException(hostname + " unknown host name");
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   107
            }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   108
            return results;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   109
        }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   110
    }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   111
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   112
    /**
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   113
     * Lookup the host name  corresponding to the IP address provided.
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   114
     *
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   115
     * @param address the specified IP address
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   116
     * @return {@code String} representing the host name
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   117
     * @throws UnknownHostException if no host found for the specified IP address
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   118
     */
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   119
    public String getHostByAddr(InetAddress address) throws UnknownHostException {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   120
        var results = getAllHostsByAddr(address);
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   121
        return results.get(0);
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   122
    }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   123
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   124
    /**
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   125
     * Lookup all known host names which correspond to the IP address provided
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   126
     *
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   127
     * @param address the specified IP address
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   128
     * @return array of {@code String} representing the host names
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   129
     * @throws UnknownHostException if no host found for the specified IP address
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   130
     */
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   131
    public List<String> getAllHostsByAddr(InetAddress address) throws UnknownHostException {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   132
        // First try hosts file
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   133
        // TODO: Add nsswitch.conf to select proper order
59101
258033faefc9 aefimov-dns-client-branch: Fix timeouts, add platform specific file locations
aefimov
parents: 58984
diff changeset
   134
        if (DEBUG) {
258033faefc9 aefimov-dns-client-branch: Fix timeouts, add platform specific file locations
aefimov
parents: 58984
diff changeset
   135
            System.err.println("Resolver API: Reverse lookup call for address:"+address);
258033faefc9 aefimov-dns-client-branch: Fix timeouts, add platform specific file locations
aefimov
parents: 58984
diff changeset
   136
        }
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   137
        try {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   138
            return List.of(hostsFileResolver.getByAddress(address));
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   139
        } catch (UnknownHostException uhe) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   140
            if (DEBUG) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   141
                System.err.printf("Resolver API: No host in hosts file with %s address%n", address);
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   142
            }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   143
        }
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   144
        try (DnsResolver dnsResolver = new DnsResolver()) {
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   145
            var literalIP = addressToLiteralIP(address);
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   146
            var results = dnsResolver.rlookup(literalIP, address);
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   147
            if (results.isEmpty()) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   148
                throw new UnknownHostException();
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   149
            }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   150
            // remove trailing dot
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   151
            return results.stream()
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   152
                    .map(host -> host.endsWith(".") ? host.substring(0, host.length() - 1) : host)
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   153
                    .collect(Collectors.toList());
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   154
        } catch (DnsResolverException dre) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   155
            UnknownHostException uhe = new UnknownHostException();
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   156
            uhe.initCause(dre);
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   157
            throw uhe;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   158
        }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   159
    }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   160
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   161
    private static String addressToLiteralIP(InetAddress address) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   162
        byte[] bytes = address.getAddress();
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   163
        StringBuilder addressBuff = new StringBuilder();
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   164
        // IPv4 address
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   165
        if (bytes.length == 4) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   166
            for (int i = bytes.length - 1; i >= 0; i--) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   167
                addressBuff.append(bytes[i] & 0xff);
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   168
                addressBuff.append(".");
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   169
            }
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   170
            // IPv6 address
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   171
        } else if (bytes.length == 16) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   172
            for (int i = bytes.length - 1; i >= 0; i--) {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   173
                addressBuff.append(Integer.toHexString((bytes[i] & 0x0f)));
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   174
                addressBuff.append(".");
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   175
                addressBuff.append(Integer.toHexString((bytes[i] & 0xf0) >> 4));
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   176
                addressBuff.append(".");
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   177
            }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   178
        } else {
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   179
            return null;
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   180
        }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   181
        return addressBuff.toString();
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   182
    }
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   183
58984
15e026239a6c aefimov-dns-client-branch: Add system property to control ANY requests
aefimov
parents: 58971
diff changeset
   184
    private List<InetAddress> lookup(DnsResolver dnsResolver, String host, ProtocolFamily protocolFamily, boolean needAllAddresses) throws UnknownHostException {
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   185
        if (DEBUG) {
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   186
            System.out.printf("Resolver API: internal lookup call - %s%n", host);
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   187
        }
58984
15e026239a6c aefimov-dns-client-branch: Add system property to control ANY requests
aefimov
parents: 58971
diff changeset
   188
        return AddressResolutionQueue.resolve(dnsResolver, host, protocolFamily, needAllAddresses);
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   189
    }
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   190
58971
465a15dd6bed aefimov-dns-client-branch: Cleanup and address ANY type failures
aefimov
parents: 58870
diff changeset
   191
    private static HostsFileResolver hostsFileResolver = new HostsFileResolver();
58870
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   192
    private static final boolean DEBUG = java.security.AccessController.doPrivileged(
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   193
            (PrivilegedAction<Boolean>) () -> Boolean.getBoolean("jdk.dns.client.debug"));
35c438a6d45c aefimov-dns-client-branch: Add jdk.dns.client source
aefimov
parents:
diff changeset
   194
}