【发布时间】:2020-07-08 17:31:09
【问题描述】:
我有以下简单的网络服务器,利用 Python 的 http 模块:
import http.server
import hashlib
class RequestHandler(http.server.BaseHTTPRequestHandler):
protocol_version = "HTTP/1.1"
def do_PUT(self):
md5 = hashlib.md5()
remaining = int(self.headers['Content-Length'])
while True:
data = self.rfile.read(min(remaining, 16384))
remaining -= len(data)
if not data or not remaining:
break
md5.update(data)
print(md5.hexdigest())
self.send_response(204)
self.send_header('Connection', 'keep-alive')
self.end_headers()
server = http.server.HTTPServer(('', 8000), RequestHandler)
server.serve_forever()
当我使用 curl 上传文件时,效果很好:
curl -vT /tmp/test http://localhost:8000/test
因为文件大小是预先知道的,curl 将发送一个Content-Length: 5 标头,所以我可以知道我应该从套接字读取多少。
但是如果文件大小未知,或者客户端决定使用chunkedTransfer-Encoding,这种方式就失败了。
可以通过以下命令进行模拟:
curl -vT /tmp/test -H "Transfer-Encoding: chunked" http://localhost:8000/test
如果我从块的self.rfile 过去读取,它将永远等待并挂起客户端,直到它中断 TCP 连接,其中self.rfile.read 将返回一个空数据,然后它会跳出循环。
需要什么来扩展上述示例以支持chunked Transfer-Encoding?
【问题讨论】: