From fb5add033b1656b7b33773f8f3786977e03463d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= Date: Thu, 18 Sep 2025 10:13:13 +0200 Subject: [PATCH] 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 a556199c7b7888706806a10508f5df8a0b2cb34e) --- bin/tests/system/isctest/asyncserver.py | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/bin/tests/system/isctest/asyncserver.py b/bin/tests/system/isctest/asyncserver.py index b74b90c105..e5277696cc 100644 --- a/bin/tests/system/isctest/asyncserver.py +++ b/bin/tests/system/isctest/asyncserver.py @@ -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.