diff --git a/netwerk/base/NetworkConnectivityService.cpp b/netwerk/base/NetworkConnectivityService.cpp index a3f8c36e757e..2e643e9458d3 100644 --- a/netwerk/base/NetworkConnectivityService.cpp +++ b/netwerk/base/NetworkConnectivityService.cpp @@ -269,7 +269,7 @@ NS_IMETHODIMP NetworkConnectivityService::OnLookupComplete(nsICancelable* aRequest, nsIDNSRecord* aRecord, nsresult aStatus) { - ConnectivityState state = aRecord ? OK : NOT_AVAILABLE; + ConnectivityState state = NS_SUCCEEDED(aStatus) ? OK : NOT_AVAILABLE; if (aRequest == mDNSv4Request) { mDNSv4 = state; diff --git a/netwerk/base/nsDNSPrefetch.cpp b/netwerk/base/nsDNSPrefetch.cpp index bd5ce0429fdd..4c29e1de82af 100644 --- a/netwerk/base/nsDNSPrefetch.cpp +++ b/netwerk/base/nsDNSPrefetch.cpp @@ -75,21 +75,16 @@ nsresult nsDNSPrefetch::Prefetch(nsIDNSService::DNSFlags flags) { mOriginAttributes, getter_AddRefs(tmpOutstanding)); } -nsresult nsDNSPrefetch::PrefetchLow(bool refreshDNS) { - return Prefetch(nsIDNSService::RESOLVE_PRIORITY_LOW | - (refreshDNS ? nsIDNSService::RESOLVE_BYPASS_CACHE - : nsIDNSService::RESOLVE_DEFAULT_FLAGS)); +nsresult nsDNSPrefetch::PrefetchLow(nsIDNSService::DNSFlags aFlags) { + return Prefetch(nsIDNSService::RESOLVE_PRIORITY_LOW | aFlags); } -nsresult nsDNSPrefetch::PrefetchMedium(bool refreshDNS) { - return Prefetch(nsIDNSService::RESOLVE_PRIORITY_MEDIUM | - (refreshDNS ? nsIDNSService::RESOLVE_BYPASS_CACHE - : nsIDNSService::RESOLVE_DEFAULT_FLAGS)); +nsresult nsDNSPrefetch::PrefetchMedium(nsIDNSService::DNSFlags aFlags) { + return Prefetch(nsIDNSService::RESOLVE_PRIORITY_MEDIUM | aFlags); } -nsresult nsDNSPrefetch::PrefetchHigh(bool refreshDNS) { - return Prefetch(refreshDNS ? nsIDNSService::RESOLVE_BYPASS_CACHE - : nsIDNSService::RESOLVE_DEFAULT_FLAGS); +nsresult nsDNSPrefetch::PrefetchHigh(nsIDNSService::DNSFlags aFlags) { + return Prefetch(aFlags); } namespace { diff --git a/netwerk/base/nsDNSPrefetch.h b/netwerk/base/nsDNSPrefetch.h index 13e85f500768..7cad00b58852 100644 --- a/netwerk/base/nsDNSPrefetch.h +++ b/netwerk/base/nsDNSPrefetch.h @@ -45,9 +45,12 @@ class nsDNSPrefetch final : public nsIDNSListener { static nsresult Shutdown(); // Call one of the following methods to start the Prefetch. - nsresult PrefetchHigh(bool refreshDNS = false); - nsresult PrefetchMedium(bool refreshDNS = false); - nsresult PrefetchLow(bool refreshDNS = false); + nsresult PrefetchHigh( + nsIDNSService::DNSFlags = nsIDNSService::RESOLVE_DEFAULT_FLAGS); + nsresult PrefetchMedium( + nsIDNSService::DNSFlags = nsIDNSService::RESOLVE_DEFAULT_FLAGS); + nsresult PrefetchLow( + nsIDNSService::DNSFlags = nsIDNSService::RESOLVE_DEFAULT_FLAGS); nsresult FetchHTTPSSVC( bool aRefreshDNS, bool aPrefetch, diff --git a/netwerk/dns/nsDNSService2.cpp b/netwerk/dns/nsDNSService2.cpp index cc434e9bdcda..c34c9d80a57e 100644 --- a/netwerk/dns/nsDNSService2.cpp +++ b/netwerk/dns/nsDNSService2.cpp @@ -498,7 +498,8 @@ void nsDNSAsyncRequest::OnResolveHostComplete(nsHostResolver* resolver, // the caller to be able to addref/release multiple times without // destroying the record prematurely. nsCOMPtr rec; - if (NS_SUCCEEDED(status)) { + if (NS_SUCCEEDED(status) || + mFlags & nsIDNSService::RESOLVE_WANT_RECORD_ON_ERROR) { MOZ_ASSERT(hostRecord, "no host record"); if (hostRecord->type != nsDNSService::RESOLVE_TYPE_DEFAULT) { rec = new nsDNSByTypeRecord(hostRecord); diff --git a/netwerk/dns/nsIDNSService.idl b/netwerk/dns/nsIDNSService.idl index 895eb153b208..2a72e3796ca6 100644 --- a/netwerk/dns/nsIDNSService.idl +++ b/netwerk/dns/nsIDNSService.idl @@ -90,9 +90,12 @@ interface nsIDNSService : nsISupports RESOLVE_IP_HINT = (1 << 14), // If set, do not use ODoH for resolving the host name. RESOLVE_DISABLE_ODOH = (1 << 15), + // If set, the DNS service will pass a DNS record to + // OnLookupComplete even when there was a resolution error. + RESOLVE_WANT_RECORD_ON_ERROR = (1 << 16), // Bitflag containing all possible flags. - ALL_DNSFLAGS_BITS = ((1 << 16) - 1), + ALL_DNSFLAGS_BITS = ((1 << 17) - 1), }; /** diff --git a/netwerk/protocol/http/TRRServiceChannel.cpp b/netwerk/protocol/http/TRRServiceChannel.cpp index 99d7a1a104c2..60081bd0b3ed 100644 --- a/netwerk/protocol/http/TRRServiceChannel.cpp +++ b/netwerk/protocol/http/TRRServiceChannel.cpp @@ -779,7 +779,12 @@ void TRRServiceChannel::MaybeStartDNSPrefetch() { mDNSPrefetch = new nsDNSPrefetch(mURI, originAttributes, nsIRequest::GetTRRMode(), this, LoadTimingEnabled()); - mDNSPrefetch->PrefetchHigh(mCaps & NS_HTTP_REFRESH_DNS); + nsIDNSService::DNSFlags dnsFlags = nsIDNSService::RESOLVE_DEFAULT_FLAGS; + if (mCaps & NS_HTTP_REFRESH_DNS) { + dnsFlags |= nsIDNSService::RESOLVE_BYPASS_CACHE; + } + nsresult rv = mDNSPrefetch->PrefetchHigh(dnsFlags); + NS_ENSURE_SUCCESS_VOID(rv); } NS_IMETHODIMP diff --git a/netwerk/protocol/http/nsHttpChannel.cpp b/netwerk/protocol/http/nsHttpChannel.cpp index 3a5592530050..674ddffb5a81 100644 --- a/netwerk/protocol/http/nsHttpChannel.cpp +++ b/netwerk/protocol/http/nsHttpChannel.cpp @@ -6413,7 +6413,12 @@ nsresult nsHttpChannel::MaybeStartDNSPrefetch() { mDNSPrefetch = new nsDNSPrefetch(mURI, originAttributes, nsIRequest::GetTRRMode(), this, LoadTimingEnabled()); - nsresult rv = mDNSPrefetch->PrefetchHigh(mCaps & NS_HTTP_REFRESH_DNS); + nsIDNSService::DNSFlags dnsFlags = + nsIDNSService::RESOLVE_WANT_RECORD_ON_ERROR; + if (mCaps & NS_HTTP_REFRESH_DNS) { + dnsFlags |= nsIDNSService::RESOLVE_BYPASS_CACHE; + } + nsresult rv = mDNSPrefetch->PrefetchHigh(dnsFlags); if (dnsStrategy & DNS_BLOCK_ON_ORIGIN_RESOLVE) { LOG((" blocking on prefetching origin"));