From 17fc3499ffa7a3e927fc5744830520649ab06ac9 Mon Sep 17 00:00:00 2001 From: JustAnotherArchivist Date: Thu, 2 Jul 2020 14:15:56 +0000 Subject: [PATCH] Fix infinite loop in workaround for aiohttp issue 4630 If a response ends with '0\r\n' or '0\r\n\r', ClientResponse._read loops forever trying to read 4 more bytes. In addition, bump that read to 1 KiB for better worst-case performance. --- qwarc/aiohttp.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/qwarc/aiohttp.py b/qwarc/aiohttp.py index 48ebf49..ab5012a 100644 --- a/qwarc/aiohttp.py +++ b/qwarc/aiohttp.py @@ -128,14 +128,20 @@ class ClientResponse(aiohttp.client_reqrep.ClientResponse): length = None parser = aiohttp.http_parser.HttpPayloadParser(payload, length = length, chunked = respMsg.chunked, compression = respMsg.compression, code = respMsg.code, method = self.method) while beginning.endswith(b'0\r\n') or beginning.endswith(b'0\r\n\r'): # https://github.com/aio-libs/aiohttp/issues/4630 - beginning = beginning + self._rawData.responseData.read(4) + chunk4630 = self._rawData.responseData.read(1024) + if not chunk4630: + break + beginning = beginning + chunk4630 eof, data = parser.feed_data(beginning[pos + 4:]) while True: chunk = self._rawData.responseData.read(1048576) if not chunk: break while chunk.endswith(b'0\r\n') or chunk.endswith(b'0\r\n\r'): # https://github.com/aio-libs/aiohttp/issues/4630 - chunk = chunk + self._rawData.responseData.read(4) + chunk4630 = self._rawData.responseData.read(1024) + if not chunk4630: + break + chunk = chunk + chunk4630 eof, data = parser.feed_data(chunk) if nbytes is not None and payload.data.tell() >= nbytes: if payload.exc: