mirror of https://github.com/scrapy/scrapy.git
28 lines
847 B
Python
28 lines
847 B
Python
from twisted.internet import defer
|
|
from twisted.internet.base import ThreadedResolver
|
|
|
|
from scrapy.utils.datatypes import LocalCache
|
|
|
|
# TODO: cache misses
|
|
|
|
dnscache = LocalCache(10000)
|
|
|
|
class CachingThreadedResolver(ThreadedResolver):
|
|
def __init__(self, reactor, cache_size, timeout):
|
|
super(CachingThreadedResolver, self).__init__(reactor)
|
|
dnscache.limit = cache_size
|
|
self.timeout = timeout
|
|
|
|
def getHostByName(self, name, timeout=None):
|
|
if name in dnscache:
|
|
return defer.succeed(dnscache[name])
|
|
if not timeout:
|
|
timeout = self.timeout
|
|
d = super(CachingThreadedResolver, self).getHostByName(name, timeout)
|
|
d.addCallback(self._cache_result, name)
|
|
return d
|
|
|
|
def _cache_result(self, result, name):
|
|
dnscache[name] = result
|
|
return result
|