rdclass=dns.rdataclass.IN,
*args, **kwargs)
+ def canonical_name(self, name):
+ """Determine the canonical name of *name*.
+
+ The canonical name is the name the resolver uses for queries
+ after all CNAME and DNAME renamings have been applied.
+
+ *name*, a ``dns.name.Name`` or ``str``, the query name.
+
+ This method can raise any exception that ``resolve()`` can
+ raise, other than `dns.resolver.NoAnswer`` and
+ ``dns.resolver.NXDOMAIN``.
+
+ Returns a ``dns.name.Name``.
+ """
+ if isinstance(name, str):
+ name = dns.name.from_text(name)
+ try:
+ answer = self.resolve(name, raise_on_no_answer=False)
+ canonical_name = answer.canonical_name
+ except dns.resolver.NXDOMAIN as e:
+ canonical_name = e.canonical_name
+ return canonical_name
+
def use_tsig(self, keyring, keyname=None,
algorithm=dns.tsig.default_algorithm):
"""Add a TSIG signature to each query.
return get_default_resolver().resolve_address(ipaddr, *args, **kwargs)
+def canonical_name(name):
+ """Determine the canonical name of *name*.
+
+ See ``dns.resolver.Resolver.canonical_name`` for more information on the
+ parameters and possible exceptions.
+ """
+
+ return get_default_resolver().canonical_name(name)
+
+
def zone_for_name(name, rdclass=dns.rdataclass.IN, tcp=False, resolver=None):
"""Find the name of the zone which contains the specified name.
answer2 = res.resolve('dns.google.', 'A')
self.assertIs(answer2, answer1)
+ def testCanonicalNameNoCNAME(self):
+ cname = dns.name.from_text('www.google.com')
+ self.assertTrue(dns.resolver.canonical_name('www.google.com') == cname)
+
+ def testCanonicalNameCNAME(self):
+ name = dns.name.from_text('www.dnspython.org')
+ cname = dns.name.from_text('dmfrjf4ips8xa.cloudfront.net')
+ self.assertTrue(dns.resolver.canonical_name(name) == cname)
+
+ def testCanonicalNameDangling(self):
+ name = dns.name.from_text('dangling-cname.dnspython.org')
+ cname = dns.name.from_text('dangling-target.dnspython.org')
+ self.assertTrue(dns.resolver.canonical_name(name) == cname)
+
class PollingMonkeyPatchMixin(object):
def setUp(self):
self.__native_selector_class = dns.query._selector_class