connection: Optional[dns.quic.AsyncQuicConnection] = None,
verify: Union[bool, str] = True,
backend: Optional[dns.asyncbackend.Backend] = None,
+ server_hostname: Optional[str] = None,
) -> dns.message.Message:
"""Return the response obtained after sending an asynchronous query via
DNS-over-QUIC.
(cfactory, mfactory) = dns.quic.factories_for_backend(backend)
async with cfactory() as context:
- async with mfactory(context, verify_mode=verify) as the_manager:
+ async with mfactory(
+ context, verify_mode=verify, server_name=server_hostname
+ ) as the_manager:
if not connection:
the_connection = the_manager.connect(where, port, source, source_port)
start = time.time()
ignore_trailing: bool = False,
connection: Optional[dns.quic.SyncQuicConnection] = None,
verify: Union[bool, str] = True,
+ server_hostname: Optional[str] = None,
) -> dns.message.Message:
"""Return the response obtained after sending a query via DNS-over-QUIC.
verification is done; if a `str` then it specifies the path to a certificate file or
directory which will be used for verification.
+ *server_hostname*, a ``str`` containing the server's hostname. The
+ default is ``None``, which means that no hostname is known, and if an
+ SSL context is created, hostname checking will be disabled.
+
Returns a ``dns.message.Message``.
"""
manager: contextlib.AbstractContextManager = contextlib.nullcontext(None)
the_connection = connection
else:
- manager = dns.quic.SyncQuicManager(verify_mode=verify)
+ manager = dns.quic.SyncQuicManager(
+ verify_mode=verify, server_name=server_hostname
+ )
the_manager = manager # for type checking happiness
with manager:
class AsyncioQuicManager(AsyncQuicManager):
- def __init__(self, conf=None, verify_mode=ssl.CERT_REQUIRED):
- super().__init__(conf, verify_mode, AsyncioQuicConnection)
+ def __init__(self, conf=None, verify_mode=ssl.CERT_REQUIRED, server_name=None):
+ super().__init__(conf, verify_mode, AsyncioQuicConnection, server_name)
def connect(self, address, port=853, source=None, source_port=0):
(connection, start) = self._connect(address, port, source, source_port)
class BaseQuicManager:
- def __init__(self, conf, verify_mode, connection_factory):
+ def __init__(self, conf, verify_mode, connection_factory, server_name=None):
self._connections = {}
self._connection_factory = connection_factory
if conf is None:
conf = aioquic.quic.configuration.QuicConfiguration(
alpn_protocols=["doq", "doq-i03"],
verify_mode=verify_mode,
+ server_name=server_name
)
if verify_path is not None:
conf.load_verify_locations(verify_path)
class SyncQuicManager(BaseQuicManager):
- def __init__(self, conf=None, verify_mode=ssl.CERT_REQUIRED):
- super().__init__(conf, verify_mode, SyncQuicConnection)
+ def __init__(self, conf=None, verify_mode=ssl.CERT_REQUIRED, server_name=None):
+ super().__init__(conf, verify_mode, SyncQuicConnection, server_name)
self._lock = threading.Lock()
def connect(self, address, port=853, source=None, source_port=0):
class TrioQuicManager(AsyncQuicManager):
- def __init__(self, nursery, conf=None, verify_mode=ssl.CERT_REQUIRED):
- super().__init__(conf, verify_mode, TrioQuicConnection)
+ def __init__(
+ self, nursery, conf=None, verify_mode=ssl.CERT_REQUIRED, server_name=None
+ ):
+ super().__init__(conf, verify_mode, TrioQuicConnection, server_name)
self._nursery = nursery
def connect(self, address, port=853, source=None, source_port=0):