The derived class must specify a list of `domains` that it wants to handle.
Queries for any of these domains (and their subdomains) will then be passed
to the `get_response()` method in the derived class.
+
+ The most specific matching domain is stored in the `matched_domain` attribute.
"""
@property
raise NotImplementedError
def __init__(self) -> None:
- self._domains: List[dns.name.Name] = [
- dns.name.from_text(d) for d in self.domains
- ]
+ self._domains: List[dns.name.Name] = sorted(
+ [dns.name.from_text(d) for d in self.domains], reverse=True
+ )
+ self._matched_domain: Optional[dns.name.Name] = None
+
+ @property
+ def matched_domain(self) -> dns.name.Name:
+ assert self._matched_domain is not None
+ return self._matched_domain
def __str__(self) -> str:
return f"{self.__class__.__name__}(domains: {', '.join(self.domains)})"
Handle queries whose QNAME matches any of the domains handled by this
class.
"""
+ self._matched_domain = None
for domain in self._domains:
if qctx.qname.is_subdomain(domain):
+ self._matched_domain = domain
return True
return False