From 32ebcdbc8290474b63d78d357847eebea8cb9ad9 Mon Sep 17 00:00:00 2001 From: Nagi5Yeq Date: Fri, 5 Feb 2021 16:10:32 +0800 Subject: add allow-ipv6-only option --- src/AsyncNameResolverMan.cc | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'src/AsyncNameResolverMan.cc') diff --git a/src/AsyncNameResolverMan.cc b/src/AsyncNameResolverMan.cc index be073561..d20296da 100644 --- a/src/AsyncNameResolverMan.cc +++ b/src/AsyncNameResolverMan.cc @@ -49,7 +49,11 @@ namespace aria2 { AsyncNameResolverMan::AsyncNameResolverMan() - : numResolver_(0), resolverCheck_(0), ipv4_(true), ipv6_(true) + : numResolver_(0), + resolverCheck_(0), + ipv4_(true), + ipv6_(true), + allowIpv6Only_(false) { } @@ -167,15 +171,25 @@ int AsyncNameResolverMan::getStatus() const break; } } - // If we got a IPv4 lookup response, we don't wait for a IPv6 lookup - // response. This is because DNS servers may drop AAAA queries and we - // have to wait for a long time before timeout. We don't do the - // inverse, because, based on today's deployment of DNS servers, - // almost all of them can respond to A queries just fine. - if ((success && ipv4Success) || success == numResolver_) { - return 1; + if (allowIpv6Only_ == true) { + // The waiting process of IPv4 and IPv6 lookup will eventually timeout + // the resolution of IPv6-only domains, so just report success regardless of + // which address family the result belongs to in such case. + if (success > 0) { + return 1; + } + } + else { + // If we got a IPv4 lookup response, we don't wait for a IPv6 lookup + // response. This is because DNS servers may drop AAAA queries and we + // have to wait for a long time before timeout. We don't do the + // inverse, because, based on today's deployment of DNS servers, + // almost all of them can respond to A queries just fine. + if ((success && ipv4Success) || success == numResolver_) { + return 1; + } } - else if (error == numResolver_) { + if (error == numResolver_) { return -1; } else { @@ -222,6 +236,8 @@ void configureAsyncNameResolverMan(AsyncNameResolverMan* asyncNameResolverMan, if (!net::getIPv6AddrConfigured() || option->getAsBool(PREF_DISABLE_IPV6)) { asyncNameResolverMan->setIPv6(false); } + asyncNameResolverMan->setAllowIpv6Only( + option->getAsBool(PERF_ASYNC_DNS_ALLOW_IPV6ONLY)); } } // namespace aria2 -- cgit