Open
Description
Describe the bug
A missing CRLF at the end of a chunk may happen for example when the parsed chunk size is wrong.
Parsing the end of a chunk is done by HttpPayloadParser.feed_data(), see this part of the code.
When CRLF is missing:
- The HttpPayloadParser state remains
ChunkState.PARSE_CHUNKED_CHUNK_EOF
until there are no more chunks to parse
since the next chunks processed by the following calls to feed_data() are prefixed withself._chunk_tail
so that
this code parses always the same start of sequence of bytes (which does not start with CRLF). - All the next chunks are appended to
self._chunk_tail
. - If the chunked body is large enough, such as an audio stream for example, the stream seems to hang.
To Reproduce
In a well formed chunked encoded HTTP response, replace the CRLF at the end of a chunk with two bytes that are not CRLF.
Expected behavior
A fix could be:
- Change also the parser state to ChunkState.PARSE_CHUNKED_SIZE when the CRLF is missing.
- Alternatively raise an exception.
Logs/tracebacks
-
Python Version
-
aiohttp Version
commit d3dc087b8e9aa665d47045550e5d9f2eddf8f512 (HEAD -> master, origin/master, origin/HEAD)
Date: Wed Jan 22 05:53:25 2025 -0800
multidict Version
-
propcache Version
-
yarl Version
-
OS
Related component
Server
Additional context
This issue is the result of a code review.
Code of Conduct
- I agree to follow the aio-libs Code of Conduct