Initial import to Tizen
[profile/ivi/python-twisted.git] / twisted / names / resolve.py
1 # Copyright (c) Twisted Matrix Laboratories.
2 # See LICENSE for details.
3
4
5 """
6 Lookup a name using multiple resolvers.
7
8 Future Plans: This needs someway to specify which resolver answered
9 the query, or someway to specify (authority|ttl|cache behavior|more?)
10
11 @author: Jp Calderone
12 """
13
14 from twisted.internet import defer, interfaces
15 from twisted.names import dns
16 from zope.interface import implements
17 import common
18
19 class FailureHandler:
20     def __init__(self, resolver, query, timeout):
21         self.resolver = resolver
22         self.query = query
23         self.timeout = timeout
24
25
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)
30
31
32 class ResolverChain(common.ResolverBase):
33     """Lookup an address using multiple C{IResolver}s"""
34
35     implements(interfaces.IResolver)
36
37
38     def __init__(self, resolvers):
39         common.ResolverBase.__init__(self)
40         self.resolvers = resolvers
41
42
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:]:
47             d = d.addErrback(
48                 FailureHandler(r.query, q, timeout)
49             )
50         return d
51
52
53     def lookupAllRecords(self, name, timeout = None):
54         d = self.resolvers[0].lookupAllRecords(name, timeout)
55         for r in self.resolvers[1:]:
56             d = d.addErrback(
57                 FailureHandler(r.lookupAllRecords, name, timeout)
58             )
59         return d