Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 23 additions & 14 deletions src/zeroconf/_services/info.py
Original file line number Diff line number Diff line change
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