Add a response handler matching on specific QNAMEs

Add a new ResponseHandler subclass, QnameHandler, which enables
conveniently matching specific QNAMEs (without also matching their
subdomains like DomainHandler does).

(cherry picked from commit a556199c7b)
This commit is contained in:
Michał Kępień 2025-09-18 10:13:13 +02:00 committed by Štěpán Balážik (GitLab job 6405063)
parent 7809004875
commit fb5add033b

View file

@ -554,6 +554,37 @@ class IgnoreAllQueries(ResponseHandler):
yield ResponseDrop()
class QnameHandler(ResponseHandler):
"""
Base class used for deriving custom QNAME handlers.
The derived class must specify a list of `qnames` that it wants to handle.
Queries for exactly these QNAMEs will then be passed to the
`get_response()` method in the derived class.
"""
@property
@abc.abstractmethod
def qnames(self) -> List[str]:
"""
A list of QNAMEs handled by this class.
"""
raise NotImplementedError
def __init__(self) -> None:
self._qnames: List[dns.name.Name] = [dns.name.from_text(d) for d in self.qnames]
def __str__(self) -> str:
return f"{self.__class__.__name__}(QNAMEs: {', '.join(self.qnames)})"
def match(self, qctx: QueryContext) -> bool:
"""
Handle queries whose QNAME matches any of the QNAMEs handled by this
class.
"""
return qctx.qname in self._qnames
class DomainHandler(ResponseHandler):
"""
Base class used for deriving custom domain handlers.