У меня есть следующий простой веб-сервер, использующий модуль 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
, поэтому я могу знать, сколько я должен прочитать из сокета.
Но если размер файла равен неизвестно, или клиент решает использовать chunked
Transfer-Encoding, этот подход не работает.
Его можно смоделировать с помощью следующей команды:
curl -vT /tmp/test -H "Transfer-Encoding: chunked" http://localhost:8000/test
Если Я прочитал из self.rfile
прошлого чанка, он будет ждать вечно и зависать клиент, пока он не разорвет TCP-соединение, где self.rfile.read
вернет пустые данные, затем он выйдет из l oop.
Что потребуется для расширения приведенного выше примера для поддержки chunked
Transfer-Encoding также?