Skip to content

Commit c653573

Browse files
committed
Make zone_status_iterator raise a ServerNotReadyError when it gets an incomplete read
1 parent db1a07e commit c653573

1 file changed

Lines changed: 19 additions & 8 deletions

File tree

brainframe/api/stubs/zone_statuses.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import json
12
from typing import Dict, Generator
23

3-
import json
4+
import requests
45

5-
from brainframe.api.bf_codecs import ZoneStatus
6+
from brainframe.api import bf_codecs, bf_errors
67
from .base_stub import BaseStub, DEFAULT_TIMEOUT
78

8-
ZONE_STATUS_TYPE = Dict[int, Dict[str, ZoneStatus]]
9+
ZONE_STATUS_TYPE = Dict[int, Dict[str, bf_codecs.ZoneStatus]]
910
ZONE_STATUS_STREAM_TYPE = Generator[ZONE_STATUS_TYPE, None, None]
1011

1112

@@ -28,7 +29,7 @@ def get_latest_zone_statuses(self,
2829
data, _ = self._get_json(req, timeout)
2930

3031
# Convert ZoneStatuses to Codecs
31-
out = {int(s_id): {key: ZoneStatus.from_dict(val)
32+
out = {int(s_id): {key: bf_codecs.ZoneStatus.from_dict(val)
3233
for key, val in statuses.items()}
3334
for s_id, statuses in data.items()}
3435
return out
@@ -48,16 +49,26 @@ def get_zone_status_stream(self, timeout=None) -> ZONE_STATUS_STREAM_TYPE:
4849
def zone_status_iterator():
4950
# Don't use a timeout for this request, since it's ongoing
5051
resp = self._get(req, timeout=timeout)
51-
for packet in resp.iter_lines(delimiter=b"\r\n"):
52+
53+
packets = resp.iter_lines(delimiter=b"\r\n")
54+
while True:
55+
try:
56+
packet = next(packets)
57+
except requests.exceptions.ChunkedEncodingError as exc:
58+
message = "Incomplete packet while attempting to read " \
59+
"from zone status iterator"
60+
raise bf_errors.ServerNotReadyError(message) from exc
61+
5262
if packet == b'':
5363
continue
5464

5565
# Parse the line
5666
zone_statuses_dict = json.loads(packet)
5767

58-
processed = {int(s_id): {key: ZoneStatus.from_dict(val)
59-
for key, val in statuses.items()}
60-
for s_id, statuses in zone_statuses_dict.items()}
68+
processed = {
69+
int(s_id): {key: bf_codecs.ZoneStatus.from_dict(val)
70+
for key, val in statuses.items()}
71+
for s_id, statuses in zone_statuses_dict.items()}
6172
yield processed
6273

6374
return zone_status_iterator()

0 commit comments

Comments
 (0)