summaryrefslogtreecommitdiff
path: root/dns/resolver.py
diff options
context:
space:
mode:
Diffstat (limited to 'dns/resolver.py')
-rw-r--r--dns/resolver.py31
1 files changed, 20 insertions, 11 deletions
diff --git a/dns/resolver.py b/dns/resolver.py
index e81caaf..443e1d0 100644
--- a/dns/resolver.py
+++ b/dns/resolver.py
@@ -93,14 +93,15 @@ class NoNameservers(dns.exception.DNSException):
msg = "All nameservers failed to answer the query."
fmt = "%s {query}: {errors}" % msg[:-1]
- supp_kwargs = set(['query', 'errors'])
+ supp_kwargs = set(['request', 'errors'])
def _fmt_kwargs(self, **kwargs):
srv_msgs = []
for err in kwargs['errors']:
- srv_msgs.append('Server %s anwered %s' % (err[0], err[1]))
- return super(NoNameservers, self)._fmt_kwargs(query=kwargs['query'],
- errors='; '.join(srv_msgs))
+ srv_msgs.append('Server %s %s port %s anwered %s' % (err[0],
+ 'TCP' if err[1] else 'UDP', err[2], err[3]))
+ return super(NoNameservers, self)._fmt_kwargs(
+ query=kwargs['request'].question, errors='; '.join(srv_msgs))
class NotAbsolute(dns.exception.DNSException):
@@ -849,10 +850,11 @@ class Resolver(object):
backoff = 0.10
while response is None:
if len(nameservers) == 0:
- raise NoNameservers(query=request.question, errors=errors)
+ raise NoNameservers(request=request, errors=errors)
for nameserver in nameservers[:]:
timeout = self._compute_timeout(start)
try:
+ tcp_attempt = tcp
if tcp:
response = dns.query.tcp(request, nameserver,
timeout, self.port,
@@ -865,6 +867,7 @@ class Resolver(object):
source_port=source_port)
if response.flags & dns.flags.TC:
# Response truncated; retry with TCP.
+ tcp_attempt = True
timeout = self._compute_timeout(start)
response = dns.query.tcp(request, nameserver,
timeout, self.port,
@@ -875,15 +878,17 @@ class Resolver(object):
# Communication failure or timeout. Go to the
# next server
#
+ errors.append((nameserver, tcp_attempt, self.port, ex,
+ response))
response = None
- errors.append((nameserver, ex))
continue
except dns.query.UnexpectedSource as ex:
#
# Who knows? Keep going.
#
+ errors.append((nameserver, tcp_attempt, self.port, ex,
+ response))
response = None
- errors.append((nameserver, ex))
continue
except dns.exception.FormError as ex:
#
@@ -892,8 +897,9 @@ class Resolver(object):
# continue.
#
nameservers.remove(nameserver)
+ errors.append((nameserver, tcp_attempt, self.port, ex,
+ response))
response = None
- errors.append((nameserver, ex))
continue
except EOFError as ex:
#
@@ -903,13 +909,15 @@ class Resolver(object):
# mix and continue.
#
nameservers.remove(nameserver)
+ errors.append((nameserver, tcp_attempt, self.port, ex,
+ response))
response = None
- errors.append((nameserver, ex))
continue
rcode = response.rcode()
if rcode == dns.rcode.YXDOMAIN:
ex = YXDOMAIN()
- errors.append((nameserver, ex))
+ errors.append((nameserver, tcp_attempt, self.port, ex,
+ response))
raise ex
if rcode == dns.rcode.NOERROR or \
rcode == dns.rcode.NXDOMAIN:
@@ -921,7 +929,8 @@ class Resolver(object):
#
if rcode != dns.rcode.SERVFAIL or not self.retry_servfail:
nameservers.remove(nameserver)
- errors.append((nameserver, dns.rcode.to_text(rcode)))
+ errors.append((nameserver, tcp_attempt, self.port,
+ dns.rcode.to_text(rcode), response))
response = None
if not response is None:
break