summaryrefslogtreecommitdiff
path: root/dns/resolver.py
diff options
context:
space:
mode:
Diffstat (limited to 'dns/resolver.py')
-rw-r--r--dns/resolver.py18
1 files changed, 18 insertions, 0 deletions
diff --git a/dns/resolver.py b/dns/resolver.py
index c6214ca..9f9b438 100644
--- a/dns/resolver.py
+++ b/dns/resolver.py
@@ -23,6 +23,7 @@ import sys
import time
import dns.exception
+import dns.flags
import dns.ipv4
import dns.ipv6
import dns.message
@@ -772,6 +773,13 @@ class Resolver(object):
response = dns.query.udp(request, nameserver,
timeout, self.port,
source=source)
+ if response.flags & dns.flags.TC:
+ # Response truncated; retry with TCP.
+ timeout = self._compute_timeout(start)
+ response = dns.query.tcp(request, nameserver,
+ timeout, self.port,
+ source=source)
+
except (socket.error, dns.exception.Timeout):
#
# Communication failure or timeout. Go to the
@@ -794,6 +802,16 @@ class Resolver(object):
nameservers.remove(nameserver)
response = None
continue
+ except EOFError:
+ #
+ # We're using TCP and they hung up on us.
+ # Probably they don't support TCP (though
+ # they're supposed to!). Take it out of the
+ # mix and continue.
+ #
+ nameservers.remove(nameserver)
+ response = None
+ continue
rcode = response.rcode()
if rcode == dns.rcode.NOERROR or \
rcode == dns.rcode.NXDOMAIN: