+ def _lookup(self, name, cls, type, timeout = None):
+ maybeDelegate = False
+ deferredResult = authority.BindAuthority._lookup(self, name, cls,
+ type, timeout)
+ # If we didn't find an exact match for the name we were seeking,
+ # check if it's within a subdomain we're supposed to delegate to
+ # some other DNS server.
+ while (isinstance(deferredResult.result, failure.Failure)
+ and '.' in name):
+ maybeDelegate = True
+ name = name[name.find('.') + 1 :]
+ deferredResult = authority.BindAuthority._lookup(self, name, cls,
+ dns.NS, timeout)
+ return deferredResult
+
+class TypeLenientResolverChain(resolve.ResolverChain):
+ """
+ This is a ResolverChain which is more lenient in its handling of
+ queries requesting unimplemented record types.
+ """
+
+ def query(self, query, timeout = None):
+ try:
+ return self.typeToMethod[query.type](str(query.name), timeout)
+ except KeyError, e:
+ # We don't support the requested record type. Twisted would
+ # have us return SERVFAIL. Instead, we'll check whether the
+ # name exists in our zone at all and return NXDOMAIN or an empty
+ # result set with NOERROR as appropriate.
+ deferredResult = self.lookupAllRecords(str(query.name), timeout)
+ if isinstance(deferredResult.result, failure.Failure):
+ return deferredResult
+ return defer.succeed(([], [], []))
+