feat: speed up processing incoming data (#1167) · python-zeroconf/python-zeroconf@fbaaf7b
@@ -22,7 +22,7 @@
22222323import struct
2424import sys
25-from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union, cast
25+from typing import Any, Dict, List, Optional, Set, Tuple, Union
26262727from .._dns import (
2828DNSAddress,
@@ -194,10 +194,6 @@ def __repr__(self) -> str:
194194 ]
195195 )
196196197-def _unpack(self, unpacker: Callable[[bytes, int], tuple], length: int) -> tuple:
198-self.offset += length
199-return unpacker(self.data, self.offset - length)
200-201197def _read_header(self) -> None:
202198"""Reads header portion of packet"""
203199 (
@@ -207,7 +203,8 @@ def _read_header(self) -> None:
207203self.num_answers,
208204self.num_authorities,
209205self.num_additionals,
210- ) = self._unpack(UNPACK_6H, 12)
206+ ) = UNPACK_6H(self.data)
207+self.offset += 12
211208212209def _read_questions(self) -> None:
213210"""Reads questions section of packet"""
@@ -264,18 +261,24 @@ def _read_record(
264261 ) -> Optional[DNSRecord]:
265262"""Read known records types and skip unknown ones."""
266263if type_ == _TYPE_A:
267-return DNSAddress(domain, type_, class_, ttl, self._read_string(4), created=self.now)
264+dns_address = DNSAddress(domain, type_, class_, ttl, self._read_string(4))
265+dns_address.created = self.now
266+return dns_address
268267if type_ in (_TYPE_CNAME, _TYPE_PTR):
269268return DNSPointer(domain, type_, class_, ttl, self._read_name(), self.now)
270269if type_ == _TYPE_TXT:
271270return DNSText(domain, type_, class_, ttl, self._read_string(length), self.now)
272271if type_ == _TYPE_SRV:
272+priority, weight, port = UNPACK_3H(self.data, self.offset)
273+self.offset += 6
273274return DNSService(
274275domain,
275276type_,
276277class_,
277278ttl,
278-*cast(Tuple[int, int, int], self._unpack(UNPACK_3H, 6)),
279+priority,
280+weight,
281+port,
279282self._read_name(),
280283self.now,
281284 )
@@ -285,14 +288,15 @@ def _read_record(
285288type_,
286289class_,
287290ttl,
288-self._read_character_string().decode('utf-8'),
289-self._read_character_string().decode('utf-8'),
291+self._read_character_string().decode('utf-8', 'replace'),
292+self._read_character_string().decode('utf-8', 'replace'),
290293self.now,
291294 )
292295if type_ == _TYPE_AAAA:
293-return DNSAddress(
294-domain, type_, class_, ttl, self._read_string(16), created=self.now, scope_id=self.scope_id
295- )
296+dns_address = DNSAddress(domain, type_, class_, ttl, self._read_string(16))
297+dns_address.created = self.now
298+dns_address.scope_id = self.scope_id
299+return dns_address
296300if type_ == _TYPE_NSEC:
297301name_start = self.offset
298302return DNSNsec(
@@ -384,4 +388,4 @@ def _decode_labels_at_offset(self, off: int, labels: List[str], seen_pointers: S
384388 )
385389return off + DNS_COMPRESSION_POINTER_LEN
386390387-raise IncomingDecodeError("Corrupt packet received while decoding name from {self.source}")
391+raise IncomingDecodeError(f"Corrupt packet received while decoding name from {self.source}")