This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Python3 ThreadingHTTPServer fails to send chunked encoded response
Type: behavior Stage: resolved
Components: Versions: Python 3.9
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: manuel_b, martin.panter
Priority: normal Keywords:

Created on 2021-10-19 13:42 by manuel_b, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
myserver.py manuel_b, 2021-10-19 13:42 source code reproducing the issue
Messages (2)
msg404300 - (view) Author: Manuel (manuel_b) Date: 2021-10-19 13:42
I'm implementing an HTTPServer class that produces a response with transfer-encoding chunked mode.

I'm sending the chunks as described in https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding#chunked_encoding

If I send chunks of length <= 9 bytes the message is received correctly by the client, otherwise when sending chunks of length >= 10 bytes, it seems that some of them are not received and the message remains stuck in the client waiting indefinitely

In attachment an example of the complete code to reproduce the issue, but in short, the following code:

# writing 5 chunks of length 10
for i in range(5):
    text = str(i+1) * 10  # concatenate 10 chars
    chunk = '{0:d}\r\n'.format(len(text)) + text + '\r\n'
    self.wfile.write(chunk.encode(encoding='utf-8'))

# writing close sequence
close_chunk = '0\r\n\r\n'
self.wfile.write(close_chunk.encode(encoding='utf-8'))

Produces:
10\r\n
1111111111\r\n
10\r\n
2222222222\r\n
10\r\n
3333333333\r\n
10\r\n
4444444444\r\n
10\r\n
5555555555\r\n
0\r\n
\r\n

In this case the client hangs several minutes without a response 

But if I use length 9 or less instead for example with

text = str(i+1) * 9

the client receives the correct body and the communication ends correctly (in about 6ms)

The problem persists with both http.server.ThreadingHTTPServer and http.server.HTTPServer
I tried also passing the body as an hard-coded binary string

some version informations:
Python 3.9.2
HTTP Client used: Postman 8.10, curl, Chrome


Thanks a lot for any help
Manuel
msg404373 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2021-10-19 23:00
Looks like you forgot to encode the length of ten in hexadecimal.

I don't think the HTTP server module has any special handling for chunked responses, so this up to the user and isn't a bug in Python.
History
Date User Action Args
2022-04-11 14:59:51adminsetgithub: 89686
2021-10-19 23:00:07martin.pantersetstatus: open -> closed

nosy: + martin.panter
messages: + msg404373

resolution: not a bug
stage: resolved
2021-10-19 13:42:01manuel_bcreate