Handle SERVFAILs when doing AAAA lookups for federation (#2477)

... to cope with people with broken dnssec setups, mostly
This commit is contained in:
Richard van der Hoff 2017-09-28 15:24:00 +01:00 committed by GitHub
parent 768f00dedb
commit 75e67b9ee4

View file

@ -354,16 +354,28 @@ def _get_hosts_for_srv_record(dns_client, host):
return res[0] return res[0]
def eb(res): def eb(res, record_type):
res.trap(DNSNameError) if res.check(DNSNameError):
return [] return []
logger.warn("Error looking up %s for %s: %s",
record_type, host, res, res.value)
return res
# no logcontexts here, so we can safely fire these off and gatherResults # no logcontexts here, so we can safely fire these off and gatherResults
d1 = dns_client.lookupAddress(host).addCallbacks(cb, eb) d1 = dns_client.lookupAddress(host).addCallbacks(cb, eb)
d2 = dns_client.lookupIPV6Address(host).addCallbacks(cb, eb) d2 = dns_client.lookupIPV6Address(host).addCallbacks(cb, eb)
results = yield defer.gatherResults([d1, d2], consumeErrors=True) results = yield defer.DeferredList(
[d1, d2], consumeErrors=True)
# if all of the lookups failed, raise an exception rather than blowing out
# the cache with an empty result.
if results and all(s == defer.FAILURE for (s, _) in results):
defer.returnValue(results[0][1])
for (success, result) in results:
if success == defer.FAILURE:
continue
for result in results:
for answer in result: for answer in result:
if not answer.payload: if not answer.payload:
continue continue