diff --git a/src/network/kernel/qdnslookup.cpp b/src/network/kernel/qdnslookup.cpp index 35302799718..70fbb5bdd78 100644 --- a/src/network/kernel/qdnslookup.cpp +++ b/src/network/kernel/qdnslookup.cpp @@ -187,6 +187,9 @@ static void qt_qdnsservicerecord_sort(QList &records) \value NotFoundError the requested domain name does not exist (NXDOMAIN). + + \value TimeoutError the server was not reached or did not reply + in time (since 6.6). */ /*! @@ -1079,6 +1082,7 @@ void QDnsLookupRunnable::run() case QDnsLookup::NotFoundError: case QDnsLookup::ServerFailureError: case QDnsLookup::ServerRefusedError: + case QDnsLookup::TimeoutError: break; // no warning for these case QDnsLookup::ResolverError: diff --git a/src/network/kernel/qdnslookup.h b/src/network/kernel/qdnslookup.h index 1bd1b8e5ae4..ae89a0a11f5 100644 --- a/src/network/kernel/qdnslookup.h +++ b/src/network/kernel/qdnslookup.h @@ -159,7 +159,8 @@ public: InvalidReplyError, ServerFailureError, ServerRefusedError, - NotFoundError + NotFoundError, + TimeoutError, }; Q_ENUM(Error) diff --git a/src/network/kernel/qdnslookup_p.h b/src/network/kernel/qdnslookup_p.h index 1dbb10c8be1..03767fd8313 100644 --- a/src/network/kernel/qdnslookup_p.h +++ b/src/network/kernel/qdnslookup_p.h @@ -65,6 +65,12 @@ public: setError(QDnsLookup::ResolverError, qt_error_string(code)); } + void makeTimeoutError() + { + Q_ASSERT(allAreEmpty()); + setError(QDnsLookup::TimeoutError, QDnsLookup::tr("Request timed out")); + } + void makeDnsRcodeError(quint8 rcode) { Q_ASSERT(allAreEmpty()); diff --git a/src/network/kernel/qdnslookup_unix.cpp b/src/network/kernel/qdnslookup_unix.cpp index 6f082cfa7fc..be8721f8da9 100644 --- a/src/network/kernel/qdnslookup_unix.cpp +++ b/src/network/kernel/qdnslookup_unix.cpp @@ -174,7 +174,10 @@ void QDnsLookupRunnable::query(QDnsLookupReply *reply) int responseLength = res_nsend(&state, qbuffer.data(), queryLength, buffer.data(), buffer.size()); if (responseLength < 0) { // network error of some sort - reply->makeResolverSystemError(); + if (errno == ETIMEDOUT) + reply->makeTimeoutError(); + else + reply->makeResolverSystemError(); } return responseLength; }; diff --git a/src/network/kernel/qdnslookup_win.cpp b/src/network/kernel/qdnslookup_win.cpp index 24169545919..9ca8f25bbf9 100644 --- a/src/network/kernel/qdnslookup_win.cpp +++ b/src/network/kernel/qdnslookup_win.cpp @@ -91,6 +91,8 @@ void QDnsLookupRunnable::query(QDnsLookupReply *reply) const DNS_STATUS status = DnsQueryEx(&request, &results, nullptr); if (status >= DNS_ERROR_RCODE_FORMAT_ERROR && status <= DNS_ERROR_RCODE_LAST) return reply->makeDnsRcodeError(status - DNS_ERROR_RCODE_FORMAT_ERROR + 1); + else if (status == ERROR_TIMEOUT) + return reply->makeTimeoutError(); else if (status != ERROR_SUCCESS) return reply->makeResolverSystemError(status); diff --git a/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp b/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp index 4e2a5397a3c..d923a0973fb 100644 --- a/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp +++ b/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp @@ -328,7 +328,8 @@ void tst_QDnsLookup::lookup() }; if (!dnsServersMustWork && (lookup.error() == QDnsLookup::ServerFailureError - || lookup.error() == QDnsLookup::ServerRefusedError)) { + || lookup.error() == QDnsLookup::ServerRefusedError + || lookup.error() == QDnsLookup::TimeoutError)) { // It's not a QDnsLookup problem if the server refuses to answer the query. // This happens for queries of type ANY through Dnsmasq, for example. qWarning("Server refused or was unable to answer query; %s", extraErrorMsg().constData());