Skip to content

Commit 8e3adf8

Browse files
authored
Rationalize handling of values in TXT records
* Do not interpret received values; use None if a property has no value * When encoding values, use either raw bytes or UTF-8
1 parent aba2858 commit 8e3adf8

2 files changed

Lines changed: 13 additions & 26 deletions

File tree

zeroconf/__init__.py

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,20 +1646,12 @@ def _set_properties(self, properties: Union[bytes, Dict]) -> None:
16461646
if isinstance(key, str):
16471647
key = key.encode('utf-8')
16481648

1649-
if value is None:
1650-
suffix = b''
1651-
elif isinstance(value, str):
1652-
suffix = value.encode('utf-8')
1653-
elif isinstance(value, bytes):
1654-
suffix = value
1655-
elif isinstance(value, int):
1656-
if value:
1657-
suffix = b'true'
1658-
else:
1659-
suffix = b'false'
1660-
else:
1661-
suffix = b''
1662-
list_.append(b'='.join((key, suffix)))
1649+
record = key
1650+
if value is not None:
1651+
if not isinstance(value, bytes):
1652+
value = str(value).encode('utf-8')
1653+
record += b'=' + value
1654+
list_.append(record)
16631655
for item in list_:
16641656
result = b''.join((result, int2byte(len(item)), item))
16651657
self.text = result
@@ -1682,16 +1674,11 @@ def _set_text(self, text: bytes) -> None:
16821674
for s in strs:
16831675
parts = s.split(b'=', 1)
16841676
try:
1685-
key, value = parts # type: Tuple[bytes, Union[bool, bytes]]
1677+
key, value = parts # type: Tuple[bytes, Optional[bytes]]
16861678
except ValueError:
16871679
# No equals sign at all
16881680
key = s
1689-
value = False
1690-
else:
1691-
if value == b'true':
1692-
value = True
1693-
elif value == b'false' or not value:
1694-
value = False
1681+
value = None
16951682

16961683
# Only update non-existent properties
16971684
if key and result.get(key) is None:

zeroconf/test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,19 +1009,19 @@ def update_service(self, zeroconf, type, name):
10091009
# get service info without answer cache
10101010
info = zeroconf_browser.get_service_info(type_, registration_name)
10111011
assert info is not None
1012-
assert info.properties[b'prop_none'] is False
1012+
assert info.properties[b'prop_none'] is None
10131013
assert info.properties[b'prop_string'] == properties['prop_string']
1014-
assert info.properties[b'prop_float'] is False
1014+
assert info.properties[b'prop_float'] == b'1.0'
10151015
assert info.properties[b'prop_blank'] == properties['prop_blank']
1016-
assert info.properties[b'prop_true'] is True
1017-
assert info.properties[b'prop_false'] is False
1016+
assert info.properties[b'prop_true'] == b'1'
1017+
assert info.properties[b'prop_false'] == b'0'
10181018
assert info.addresses == addresses[:1] # no V6 by default
10191019
all_addresses = info.addresses_by_version(r.IPVersion.All)
10201020
assert all_addresses == addresses, all_addresses
10211021

10221022
info = zeroconf_browser.get_service_info(subtype, registration_name)
10231023
assert info is not None
1024-
assert info.properties[b'prop_none'] is False
1024+
assert info.properties[b'prop_none'] is None
10251025

10261026
# test TXT record update
10271027
sublistener = MySubListener()

0 commit comments

Comments
 (0)