From 05c0ff987df1ea3e68c84f42a38f6fc5fb55b2f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damien=20Nad=C3=A9?= <708473+Anvil@users.noreply.github.com> Date: Tue, 9 Feb 2021 15:11:14 +0100 Subject: [PATCH] Fix IPv6 address case in server_list function (#66) --- faust/transport/drivers/aiokafka.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/faust/transport/drivers/aiokafka.py b/faust/transport/drivers/aiokafka.py index 6351c3c1f..0bbc90209 100644 --- a/faust/transport/drivers/aiokafka.py +++ b/faust/transport/drivers/aiokafka.py @@ -159,10 +159,24 @@ """.strip() +def __canon_host(host, default): + """Ensure host is correctly formatted for aiokafka. That means IPv6 + addresses must enclosed in squared brackets. + """ + if not host: + return default + if ":" in host: + return f"[{host}]" + return host + + def server_list(urls: List[URL], default_port: int) -> List[str]: """Convert list of urls to list of servers accepted by :pypi:`aiokafka`.""" default_host = "127.0.0.1" - return [f"{u.host or default_host}:{u.port or default_port}" for u in urls] + # Yarl strips [] from IPv6 adresses, and aiokafka expects them. + return [ + f"{__canon_host(u.host, default_host)}:{u.port or default_port}" for u in urls + ] class ConsumerRebalanceListener(aiokafka.abc.ConsumerRebalanceListener): # type: ignore