2010-10-04 3 views
1

HTTP HEAD demandes doivent contenir l'en-tête Content-Length comme si elles étaient GET demandes. Mais si je définis un en-tête Content-Length, il est remplacé par l'environnement WSGI (discussion related to mod_wsgi).Est-ce que WSGI remplace l'en-tête `Content-Length`?

Jetez un oeil à l'exemple suivant:

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() 

... puis l'appeler avec 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 

Comment puis-je dire l'environnement WSGI ne pas remplacer la valeur de longueur du contenu ?

Répondre

0

Il n'existe aucun paramètre de configuration de ce type. Vous devez remplacer ou modifier wsgiref/handlers.py, comme ceci:

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()