1 # Copyright (c) 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)