Ticket #4912: dns_ex.diff
| File dns_ex.diff, 4.2 KB (added by bra, 2 years ago) |
|---|
-
internet/interfaces.py
56 56 57 57 class IResolverSimple(Interface): 58 58 59 def getHostByName(name, timeout = (1, 3, 11, 45) ):59 def getHostByName(name, timeout = (1, 3, 11, 45), extended = False): 60 60 """ 61 61 Resolve the domain name C{name} into an IP address. 62 62 63 63 @type name: C{str} 64 64 @type timeout: C{tuple} 65 @type extended: C{bool} 65 66 @rtype: L{twisted.internet.defer.Deferred} 66 67 @return: The callback of the Deferred that is returned will be 67 68 passed a string that represents the IP address of the specified … … 69 70 multiple types of address records are associated with the name, 70 71 A6 records will be returned in preference to AAAA records, which 71 72 will be returned in preference to A records. If there are multiple 72 records of the type to be returned, one will be selected at random. 73 records of the type to be returned, one will be selected at random, 74 except when extended = True is specified, where the gethostbyname_ex 75 Python function's return value is returned, which is a tuple of 76 (hostname, aliaslist, ipaddrlist) where hostname is the primary host 77 name responding to the given ip_address, aliaslist is a (possibly 78 empty) list of alternative host names for the same address, and 79 ipaddrlist is a list of IPv4 addresses for the same interface on the 80 same host (often but not always a single address). 73 81 74 82 @raise twisted.internet.defer.TimeoutError: Raised (asynchronously) 75 83 if the name cannot be resolved within the specified timeout period. -
internet/base.py
250 250 userDeferred.callback(result) 251 251 252 252 253 def getHostByName(self, name, timeout = (1, 3, 11, 45) ):253 def getHostByName(self, name, timeout = (1, 3, 11, 45), extended = False): 254 254 """ 255 255 See L{twisted.internet.interfaces.IResolverSimple.getHostByName}. 256 256 … … 258 258 as a timeout for the lookup. Any intermediate timeout or retry logic 259 259 is left up to the platform via L{socket.gethostbyname}. 260 260 """ 261 if extended: 262 _gethostbyname = socket.gethostbyname_ex 263 else: 264 _gethostbyname = socket.gethostbyname 261 265 if timeout: 262 266 timeoutDelay = sum(timeout) 263 267 else: … … 265 269 userDeferred = defer.Deferred() 266 270 lookupDeferred = threads.deferToThreadPool( 267 271 self.reactor, self.reactor.getThreadPool(), 268 socket.gethostbyname, name)272 _gethostbyname, name) 269 273 cancelCall = self.reactor.callLater( 270 274 timeoutDelay, self._cleanup, name, lookupDeferred) 271 275 self._runningQueries[lookupDeferred] = (userDeferred, cancelCall) … … 277 281 class BlockingResolver: 278 282 implements(IResolverSimple) 279 283 280 def getHostByName(self, name, timeout = (1, 3, 11, 45) ):284 def getHostByName(self, name, timeout = (1, 3, 11, 45), extended = False): 281 285 try: 282 address = socket.gethostbyname(name) 286 if extended: 287 address = socket.gethostbyname_ex(name) 288 else: 289 address = socket.gethostbyname(name) 283 290 except socket.error: 284 291 msg = "address %r not found" % (name,) 285 292 err = error.DNSLookupError(msg) … … 548 555 reflect.qual(self.__class__) + " did not implement getWriters") 549 556 550 557 551 def resolve(self, name, timeout = (1, 3, 11, 45) ):558 def resolve(self, name, timeout = (1, 3, 11, 45), extended = False): 552 559 """Return a Deferred that will resolve a hostname. 553 560 """ 554 561 if not name: … … 556 563 return defer.succeed('0.0.0.0') 557 564 if abstract.isIPAddress(name): 558 565 return defer.succeed(name) 559 return self.resolver.getHostByName(name, timeout )566 return self.resolver.getHostByName(name, timeout, extended) 560 567 561 568 # Installation. 562 569
