1
# -*- test-case-name: twisted.names.test -*-
2
# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
3
# See LICENSE for details.
8
from zope.interface import implements
10
from twisted.names import dns
11
from twisted.python import failure, log
12
from twisted.internet import interfaces, defer
16
class CacheResolver(common.ResolverBase):
17
"""A resolver that serves records from a local, memory cache."""
19
implements(interfaces.IResolver)
23
def __init__(self, cache = None, verbose = 0):
24
common.ResolverBase.__init__(self)
29
self.verbose = verbose
33
def __setstate__(self, state):
37
for (k, (when, (ans, add, ns))) in self.cache.items():
39
for rec in ans + add + ns:
45
def __getstate__(self):
46
for c in self.cancel.values():
52
def _lookup(self, name, cls, type, timeout):
54
q = dns.Query(name, type, cls)
56
when, (ans, auth, add) = self.cache[q]
59
log.msg('Cache miss for ' + repr(name))
60
return defer.fail(failure.Failure(dns.DomainError(name)))
63
log.msg('Cache hit for ' + repr(name))
65
return defer.succeed((
66
[dns.RRHeader(str(r.name), r.type, r.cls, r.ttl - diff, r.payload) for r in ans],
67
[dns.RRHeader(str(r.name), r.type, r.cls, r.ttl - diff, r.payload) for r in auth],
68
[dns.RRHeader(str(r.name), r.type, r.cls, r.ttl - diff, r.payload) for r in add]
72
def lookupAllRecords(self, name, timeout = None):
73
return defer.fail(failure.Failure(dns.DomainError(name)))
76
def cacheResult(self, query, payload):
78
log.msg('Adding %r to cache' % query)
80
self.cache[query] = (time.time(), payload)
82
if self.cancel.has_key(query):
83
self.cancel[query].cancel()
85
s = list(payload[0]) + list(payload[1]) + list(payload[2])
90
from twisted.internet import reactor
91
self.cancel[query] = reactor.callLater(m, self.clearEntry, query)
94
def clearEntry(self, query):
96
del self.cancel[query]