diff --git a/twisted/names/client.py b/twisted/names/client.py
index 27e4828..24e57f5 100644
|
a
|
b
|
|
| 536 | 536 | else: |
| 537 | 537 | if hosts is None: |
| 538 | 538 | hosts = r'c:\windows\hosts' |
| | 539 | hostResolver = hostsModule.Resolver(hosts) |
| | 540 | |
| 539 | 541 | from twisted.internet import reactor |
| 540 | 542 | bootstrap = _ThreadedResolverImpl(reactor) |
| 541 | | hostResolver = hostsModule.Resolver(hosts) |
| 542 | | theResolver = root.bootstrap(bootstrap) |
| | 543 | clresolver = Resolver(servers, reactor) |
| | 544 | theResolver = root.bootstrap(bootstrap, clresolver) |
| 543 | 545 | |
| 544 | 546 | L = [hostResolver, cache.CacheResolver(), theResolver] |
| 545 | 547 | return resolve.ResolverChain(L) |
diff --git a/twisted/names/root.py b/twisted/names/root.py
index a6a5eb3..fe366a3 100644
|
a
|
b
|
|
| 66 | 66 | @ivar hints: A C{list} of C{str} giving the dotted quad representation |
| 67 | 67 | of IP addresses of root servers at which to begin resolving names. |
| 68 | 68 | |
| | 69 | @ivar clresolver: auxiliary resolver for making a query |
| | 70 | |
| 69 | 71 | @ivar _maximumQueries: A C{int} giving the maximum number of queries |
| 70 | 72 | which will be attempted to resolve a single name. |
| 71 | 73 | |
| 72 | 74 | @ivar _reactor: A L{IReactorTime} and L{IReactorUDP} provider to use to |
| 73 | 75 | bind UDP ports and manage timeouts. |
| 74 | 76 | """ |
| 75 | | def __init__(self, hints, maximumQueries=10, reactor=None): |
| | 77 | def __init__(self, hints, clresolver, maximumQueries=10, reactor=None): |
| 76 | 78 | common.ResolverBase.__init__(self) |
| 77 | 79 | self.hints = hints |
| 78 | 80 | self._maximumQueries = maximumQueries |
| 79 | 81 | self._reactor = reactor |
| | 82 | self.clresolver = clresolver |
| 80 | 83 | |
| 81 | 84 | |
| 82 | 85 | def _roots(self): |
| … |
… |
|
| 112 | 115 | error. |
| 113 | 116 | @rtype: L{Deferred} |
| 114 | 117 | """ |
| 115 | | from twisted.names import client |
| 116 | | r = client.Resolver(servers=servers, reactor=self._reactor) |
| 117 | | d = r.queryUDP([query], timeout) |
| | 118 | self.clresolver.servers = servers |
| | 119 | self.clresolver.reactor = self._reactor |
| | 120 | |
| | 121 | d = self.clresolver.queryUDP([query], timeout) |
| 118 | 122 | if filter: |
| 119 | | d.addCallback(r.filterAnswers) |
| | 123 | d.addCallback(self.clresolver.filterAnswers) |
| 120 | 124 | return d |
| 121 | 125 | |
| 122 | 126 | |
| … |
… |
|
| 432 | 436 | return makePlaceholder(self.waiting[-1], name) |
| 433 | 437 | raise AttributeError(name) |
| 434 | 438 | |
| 435 | | def bootstrap(resolver): |
| | 439 | def bootstrap(resolver, clresolver): |
| 436 | 440 | """Lookup the root nameserver addresses using the given resolver |
| 437 | 441 | |
| 438 | 442 | Return a Resolver which will eventually become a C{root.Resolver} |
| … |
… |
|
| 444 | 448 | f = lambda r: r |
| 445 | 449 | L = [resolver.getHostByName('%s.root-servers.net' % d).addCallback(f) for d in domains] |
| 446 | 450 | d = defer.DeferredList(L) |
| 447 | | d.addCallback(lambda r: Resolver([e[1] for e in r if e[0]])) |
| | 451 | d.addCallback(lambda r: Resolver([e[1] for e in r if e[0]], clresolver)) |
| 448 | 452 | return DeferredResolver(d) |