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
|