fixed eof handling

This commit is contained in:
Devaev Maxim 2020-05-26 21:40:24 +03:00
parent 00bf4a2ab1
commit b1872289cb

View File

@ -61,20 +61,24 @@ class StreamerClient:
) as response: ) as response:
aiotools.raise_not_200(response) aiotools.raise_not_200(response)
reader = aiohttp.MultipartReader.from_response(response) reader = aiohttp.MultipartReader.from_response(response)
while True: while True:
frame = await reader.next() # pylint: disable=not-callable frame = await reader.next() # pylint: disable=not-callable
if not isinstance(frame, aiohttp.BodyPartReader): if not isinstance(frame, aiohttp.BodyPartReader):
raise RuntimeError("Expected body part") raise RuntimeError("Expected body part")
if hasattr(frame, "_content"): if hasattr(frame, "_content"):
# FIXME: An ugly workaround for:
# Multiple access to StreamReader in eof state, might be infinite loop
if frame._content.is_eof(): # pylint: disable=protected-access if frame._content.is_eof(): # pylint: disable=protected-access
break break
data = bytes(await frame.read())
if not data:
break
yield ( yield (
(frame.headers["X-UStreamer-Online"] == "true"), (frame.headers["X-UStreamer-Online"] == "true"),
int(frame.headers["X-UStreamer-Width"]), int(frame.headers["X-UStreamer-Width"]),
int(frame.headers["X-UStreamer-Height"]), int(frame.headers["X-UStreamer-Height"]),
bytes(await frame.read()), data,
) )
except Exception as err: # Тут бывают и ассерты, и KeyError, и прочая херня из-за корявых исключений в MultipartReader except Exception as err: # Тут бывают и ассерты, и KeyError, и прочая херня из-за корявых исключений в MultipartReader
raise StreamerError(f"{type(err).__name__}: {err}") raise StreamerError(f"{type(err).__name__}: {err}")