WSGI переопределяет заголовок `Content-Length`? - PullRequest
1 голос
/ 04 октября 2010

HTTP HEAD запросы должны содержать заголовок Content-Length, как если бы они были GET запросами.Но если я установлю заголовок Content-Length, он будет переопределен средой WSGI (обсуждение , касающееся mod_wsgi ).

Взгляните на следующий пример:

from wsgiref.simple_server import make_server

def application(environ, start_response):
    status = '200 OK'
    headers = [('Content-Type', 'text/plain'), ('Content-Length', '77')]
    start_response(status, headers)
    return []

httpd = make_server('', 8000, application)
print("Serving on port 8000...")
httpd.serve_forever()

... и затем вызвать его с помощью curl:

$ curl -X HEAD http://localhost:8000/ -i
HTTP/1.0 200 OK
Date: Mon, 04 Oct 2010 16:02:27 GMT
Server: WSGIServer/0.1 Python/2.7
Content-Type: text/plain
Content-Length: 0                         <-- should be 77

Как я могу сказать среде WSGI не переопределять значение длины содержимого?

1 Ответ

0 голосов
/ 04 октября 2010

Нет такой настройки конфигурации. Вы должны переопределить или изменить wsgiref/handlers.py, например:

from wsgiref.simple_server import make_server
from wsgiref.simple_server import ServerHandler
def finish_content(self):
    """Ensure headers and content have both been sent"""
    if not self.headers_sent:
        if (self.environ.get('REQUEST_METHOD', '') != 'HEAD' or
            'Content-Length' not in self.headers):
            self.headers['Content-Length'] = 0
        self.send_headers()
ServerHandler.finish_content = finish_content
def application(environ, start_response):
    status = '200 OK'
    headers = [('Content-Type', 'text/plain'), ('Content-Length', '77')]
    start_response(status, headers)
    return []
httpd = make_server('', 8000, application)
print("Serving on port 8000...")
httpd.serve_forever()
...