summaryrefslogtreecommitdiff
path: root/dns/resolver.py
diff options
context:
space:
mode:
Diffstat (limited to 'dns/resolver.py')
-rw-r--r--dns/resolver.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/dns/resolver.py b/dns/resolver.py
index 513841e..eb38ba2 100644
--- a/dns/resolver.py
+++ b/dns/resolver.py
@@ -1109,6 +1109,29 @@ class Resolver:
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.
@@ -1233,6 +1256,16 @@ def resolve_address(ipaddr, *args, **kwargs):
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.