[Web-SIG] HEAD requests, WSGI gateways, and middleware
manlio_perillo at libero.it
Thu Jan 24 20:35:13 CET 2008
Brian Smith ha scritto:
> My application correctly responds to HEAD requests as-is. However, it doesn't work with middleware that sets headers based on the content of the response body.
> For example, a gateway or middleware that sets ETag based on an checksum, Content-Encoding, Content-Length and/or Content-MD5 will all result in wrong results by default. Right now, my applications assume that any such gateway or the first such middleware will change environ["REQUEST_METHOD"] from "HEAD" to "GET" before the application is invoked, and discard the response body that the application generates.
> However, many gateways and middleware do not do this, and PEP 333 doesn't have anything to say about it. As a result, a 100% WSGI 1.0-compliant application is not portable between gateways.
> I suggest that a revision of PEP 333 should require the following behavior:
> 1. WSGI gateways must always set environ["REQUEST_METHOD"] to "GET" for HEAD requests. Middleware and applications will not be able to detect the difference between GET and HEAD requests.
> 2. For a HEAD request, A WSGI gateway must not iterate through the response iterable, but it must call the response iterable's close() method, if any. It must not send any output that was written via start_response(...).write() either. Consequently, WSGI applications must work correctly, and must not leak resources, when their output is not iterated; an application should not signal or log an error if the iterable's close() method is invoked without any iteration taking place.
This is done in the WSGI implementation for Nginx, as an example; and
some time ago there was a discussion about this.
Moreover, if the response iterable is a generator, no iteration (and
content generation) is done.
> Please add this issue to http://wsgi.org/wsgi/WSGI_2.0.
Regards Manlio Perillo
More information about the Web-SIG