1
# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
2
# See LICENSE for details.
6
Lookup a name using multiple resolvers.
8
Future Plans: This needs someway to specify which resolver answered
9
the query, or someway to specify (authority|ttl|cache behavior|more?)
14
from twisted.internet import defer, interfaces
15
from twisted.names import dns
16
from zope.interface import implements
20
def __init__(self, resolver, query, timeout):
21
self.resolver = resolver
23
self.timeout = timeout
26
def __call__(self, failure):
27
# AuthoritativeDomainErrors should halt resolution attempts
28
failure.trap(dns.DomainError, defer.TimeoutError, NotImplementedError)
29
return self.resolver(self.query, self.timeout)
32
class ResolverChain(common.ResolverBase):
33
"""Lookup an address using multiple C{IResolver}s"""
35
implements(interfaces.IResolver)
38
def __init__(self, resolvers):
39
common.ResolverBase.__init__(self)
40
self.resolvers = resolvers
43
def _lookup(self, name, cls, type, timeout):
44
q = dns.Query(name, type, cls)
45
d = self.resolvers[0].query(q, timeout)
46
for r in self.resolvers[1:]:
48
FailureHandler(r.query, q, timeout)
53
def lookupAllRecords(self, name, timeout = None):
54
d = self.resolvers[0].lookupAllRecords(name, timeout)
55
for r in self.resolvers[1:]:
57
FailureHandler(r.lookupAllRecords, name, timeout)