Skip to content

Commit

Permalink
feat: reduce overhead to enumerate ip addresses in ServiceInfo (#1181)
Browse files Browse the repository at this point in the history
  • Loading branch information
bdraco committed Jun 13, 2023
1 parent 8b44947 commit 6a85cbf
Showing 1 changed file with 23 additions and 14 deletions.
37 changes: 23 additions & 14 deletions src/zeroconf/_services/info.py
Expand Up @@ -63,6 +63,8 @@
_TYPE_TXT,
)

_IPVersion_All_value = IPVersion.All.value
_IPVersion_V4Only_value = IPVersion.V4Only.value
# https://datatracker.ietf.org/doc/html/rfc6762#section-5.2
# The most common case for calling ServiceInfo is from a
# ServiceBrowser. After the first request we add a few random
Expand Down Expand Up @@ -245,14 +247,15 @@ def addresses_by_version(self, version: IPVersion) -> List[bytes]:
This means the first address will always be the most recently added
address of the given IP version.
"""
if version == IPVersion.V4Only:
version_value = version.value
if version_value == _IPVersion_All_value:
return [
*(addr.packed for addr in self._ipv4_addresses),
*(addr.packed for addr in self._ipv6_addresses),
]
if version_value == _IPVersion_V4Only_value:
return [addr.packed for addr in self._ipv4_addresses]
if version == IPVersion.V6Only:
return [addr.packed for addr in self._ipv6_addresses]
return [
*(addr.packed for addr in self._ipv4_addresses),
*(addr.packed for addr in self._ipv6_addresses),
]
return [addr.packed for addr in self._ipv6_addresses]

def ip_addresses_by_version(
self, version: IPVersion
Expand All @@ -265,11 +268,17 @@ def ip_addresses_by_version(
This means the first address will always be the most recently added
address of the given IP version.
"""
if version == IPVersion.V4Only:
return self._ip_addresses_by_version_value(version.value)

def _ip_addresses_by_version_value(
self, version_value: int
) -> Union[List[ipaddress.IPv4Address], List[ipaddress.IPv6Address], List[ipaddress._BaseAddress]]:
"""Backend for addresses_by_version that uses the raw value."""
if version_value == _IPVersion_All_value:
return [*self._ipv4_addresses, *self._ipv6_addresses]
if version_value == _IPVersion_V4Only_value:
return self._ipv4_addresses
if version == IPVersion.V6Only:
return self._ipv6_addresses
return [*self._ipv4_addresses, *self._ipv6_addresses]
return self._ipv6_addresses

def parsed_addresses(self, version: IPVersion = IPVersion.All) -> List[str]:
"""List addresses in their parsed string form.
Expand All @@ -280,7 +289,7 @@ def parsed_addresses(self, version: IPVersion = IPVersion.All) -> List[str]:
This means the first address will always be the most recently added
address of the given IP version.
"""
return [str(addr) for addr in self.ip_addresses_by_version(version)]
return [str(addr) for addr in self._ip_addresses_by_version_value(version.value)]

def parsed_scoped_addresses(self, version: IPVersion = IPVersion.All) -> List[str]:
"""Equivalent to parsed_addresses, with the exception that IPv6 Link-Local
Expand All @@ -296,7 +305,7 @@ def parsed_scoped_addresses(self, version: IPVersion = IPVersion.All) -> List[st
return self.parsed_addresses(version)
return [
f"{addr}%{self.interface_index}" if addr.version == 6 and addr.is_link_local else str(addr)
for addr in self.ip_addresses_by_version(version)
for addr in self._ip_addresses_by_version_value(version.value)
]

def _set_properties(self, properties: Dict) -> None:
Expand Down Expand Up @@ -494,7 +503,7 @@ def dns_addresses(
address.packed,
created=created,
)
for address in self.ip_addresses_by_version(version)
for address in self._ip_addresses_by_version_value(version.value)
]

def dns_pointer(self, override_ttl: Optional[int] = None, created: Optional[float] = None) -> DNSPointer:
Expand Down

0 comments on commit 6a85cbf

Please sign in to comment.