Home / Class/ DefaultDnsServerAddressStreamProvider Class — netty Architecture

DefaultDnsServerAddressStreamProvider Class — netty Architecture

Architecture documentation for the DefaultDnsServerAddressStreamProvider class in DefaultDnsServerAddressStreamProvider.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  be6eae1d_0275_78da_bffc_26f7ae09fa68["DefaultDnsServerAddressStreamProvider"]
  2e906854_bec8_eb6d_82d1_98bf7fdc21da["DefaultDnsServerAddressStreamProvider.java"]
  be6eae1d_0275_78da_bffc_26f7ae09fa68 -->|defined in| 2e906854_bec8_eb6d_82d1_98bf7fdc21da
  37f26fd3_813c_9a37_949d_c96217ccb815["DefaultDnsServerAddressStreamProvider()"]
  be6eae1d_0275_78da_bffc_26f7ae09fa68 -->|method| 37f26fd3_813c_9a37_949d_c96217ccb815
  e10c5b1f_8d2f_e9c3_6fce_c9e8e0662c04["DnsServerAddressStream()"]
  be6eae1d_0275_78da_bffc_26f7ae09fa68 -->|method| e10c5b1f_8d2f_e9c3_6fce_c9e8e0662c04
  617e5f5c_3a18_a5be_7066_22ccccc5d463["defaultAddressList()"]
  be6eae1d_0275_78da_bffc_26f7ae09fa68 -->|method| 617e5f5c_3a18_a5be_7066_22ccccc5d463
  644ab94d_cf49_dd4f_c68d_c4dca4dd21ed["DnsServerAddresses()"]
  be6eae1d_0275_78da_bffc_26f7ae09fa68 -->|method| 644ab94d_cf49_dd4f_c68d_c4dca4dd21ed

Relationship Graph

Source Code

resolver-dns/src/main/java/io/netty/resolver/dns/DefaultDnsServerAddressStreamProvider.java lines 40–181

public final class DefaultDnsServerAddressStreamProvider implements DnsServerAddressStreamProvider {
    private static final InternalLogger logger =
            InternalLoggerFactory.getInstance(DefaultDnsServerAddressStreamProvider.class);
    private static final String DEFAULT_FALLBACK_SERVER_PROPERTY = "io.netty.resolver.dns.defaultNameServerFallback";
    public static final DefaultDnsServerAddressStreamProvider INSTANCE = new DefaultDnsServerAddressStreamProvider();

    private static final List<InetSocketAddress> DEFAULT_NAME_SERVER_LIST;
    private static final DnsServerAddresses DEFAULT_NAME_SERVERS;
    static final int DNS_PORT = 53;

    static {
        final List<InetSocketAddress> defaultNameServers = new ArrayList<InetSocketAddress>(2);
        if (!PlatformDependent.isAndroid()) {
            // Skip this on Android; it has neither /etc/resolv.conf nor JNDI classes.
            // See https://github.com/netty/netty/issues/8654
            if (!PlatformDependent.isWindows()) {
                // Try reading /etc/resolv.conf. It's usually found on Linux or macOS, but can also be missing.
                try {
                    defaultNameServers.addAll(ResolvConf.system().getNameservers());
                } catch (IllegalStateException e) {
                    String fallbackMessage = "Failed to get name servers from /etc/resolv.conf; will fall back to JNDI";
                    if (logger.isDebugEnabled()) {
                        // Always log at INFO, but only include stack trace if DEBUG is enabled.
                        logger.info(fallbackMessage, e);
                    } else {
                        logger.info(fallbackMessage);
                    }
                    DirContextUtils.addNameServers(defaultNameServers, DNS_PORT);
                }
            } else {
                DirContextUtils.addNameServers(defaultNameServers, DNS_PORT);
            }
        }

        // Only try when using on Java8 and lower as otherwise it will produce:
        // WARNING: Illegal reflective access by io.netty.resolver.dns.DefaultDnsServerAddressStreamProvider
        if (PlatformDependent.javaVersion() < 9 && defaultNameServers.isEmpty()) {
            try {
                Class<?> configClass = Class.forName("sun.net.dns.ResolverConfiguration");
                Method open = configClass.getMethod("open");
                Method nameservers = configClass.getMethod("nameservers");
                Object instance = open.invoke(null);

                @SuppressWarnings("unchecked")
                final List<String> list = (List<String>) nameservers.invoke(instance);
                for (String a: list) {
                    if (a != null) {
                        defaultNameServers.add(new InetSocketAddress(SocketUtils.addressByName(a), DNS_PORT));
                    }
                }
            } catch (Exception ignore) {
                // Failed to get the system name server list via reflection.
                // Will add the default name servers afterwards.
            }
        }

        if (!defaultNameServers.isEmpty()) {
            if (logger.isDebugEnabled()) {
                logger.debug(
                        "Default DNS servers: {} (sun.net.dns.ResolverConfiguration)", defaultNameServers);
            }
        } else {
            String defaultNameserverString = SystemPropertyUtil.get(DEFAULT_FALLBACK_SERVER_PROPERTY, null);
            if (defaultNameserverString != null) {
                for (String server : defaultNameserverString.split(",")) {
                    String dns = server.trim();
                    if (!NetUtil.isValidIpV4Address(dns) && !NetUtil.isValidIpV6Address(dns)) {
                        throw new ExceptionInInitializerError(DEFAULT_FALLBACK_SERVER_PROPERTY + " doesn't" +
                                " contain a valid list of NameServers: " + defaultNameserverString);
                    }
                    defaultNameServers.add(SocketUtils.socketAddress(server.trim(), DNS_PORT));
                }
                if (defaultNameServers.isEmpty()) {
                    throw new ExceptionInInitializerError(DEFAULT_FALLBACK_SERVER_PROPERTY + " doesn't" +
                            " contain a valid list of NameServers: " + defaultNameserverString);
                }

                if (logger.isWarnEnabled()) {
                    logger.warn(
                            "Default DNS servers: {} (Configured by {} system property)",
                            defaultNameServers, DEFAULT_FALLBACK_SERVER_PROPERTY);

Frequently Asked Questions

What is the DefaultDnsServerAddressStreamProvider class?
DefaultDnsServerAddressStreamProvider is a class in the netty codebase, defined in resolver-dns/src/main/java/io/netty/resolver/dns/DefaultDnsServerAddressStreamProvider.java.
Where is DefaultDnsServerAddressStreamProvider defined?
DefaultDnsServerAddressStreamProvider is defined in resolver-dns/src/main/java/io/netty/resolver/dns/DefaultDnsServerAddressStreamProvider.java at line 40.

Analyze Your Own Codebase

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

Try Supermodel Free