Как обрабатывать кусочную кодировку в Python BaseHTTPRequestHandler? - PullRequest
1 голос
/ 28 марта 2020

У меня есть следующий простой веб-сервер, использующий модуль 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 также?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...