[Web-SIG] WSGI 2.0
Graham Dumpleton
graham.dumpleton at gmail.com
Fri Apr 6 04:08:17 CEST 2007
On 03/04/07, Clark C. Evans <cce at clarkevans.com> wrote:
> On Fri, Mar 30, 2007 at 11:10:17AM +1000, Graham Dumpleton wrote:
> | One other issue if aiming at supporting chunked encoding for a request,
> | is how (if one even can) make available the trailing headers if present
> | after the final null data block. Personally I am not sure this one is
> | worth the trouble and may be quite hard to even implement with some web
> | servers as they don't even provide them as a separate set of headers but
> | simply merge them on top of the main request headers.
>
> In my particular application it'd be quite helpful if I could return
> Chunked-Body responses (especially ones with additional trailing
> headers). Since WSGI rules the use of transfer encodings, then it should
> have a mechanism to request this sort of behavior aka, yield a "flush"
> object that has optional trailing headers that should be included in the
> chunk that is returned.
Do you know of any actual web servers that provide a facility for
sending trailers after the final null chunk in a response? Apache for
one doesn't provide a way of doing this:
/* RFC 2616, Section 3.6.1
*
* If there is an EOS bucket, then prefix it with:
* 1) the last-chunk marker ("0" CRLF)
* 2) the trailer
* 3) the end-of-chunked body CRLF
*
* We only do this if we have not seen an error bucket with
* status HTTP_BAD_GATEWAY. We have memorized an
* error bucket that we had seen in the filter context.
* The error bucket with status HTTP_BAD_GATEWAY indicates that the
* connection to the backend (mod_proxy) broke in the middle of the
* response. In order to signal the client that something went wrong
* we do not create the last-chunk marker and set c->keepalive to
* AP_CONN_CLOSE in the core output filter.
*
* XXX: it would be nice to combine this with the end-of-chunk
* marker above, but this is a bit more straight-forward for
* now.
*/
if (eos && !f->ctx) {
/* XXX: (2) trailers ... does not yet exist */
e = apr_bucket_immortal_create(ASCII_ZERO ASCII_CRLF
/* <trailers> */
ASCII_CRLF, 5, c->bucket_alloc);
APR_BUCKET_INSERT_BEFORE(eos, e);
}
Note the comment that step 2, sending of trailers doesn't yet exist.
So even if WSGI had a way of supplying trailers, I doubt there would
be many WSGI adapters for web servers that could actually implement
it.
FWIW, in mod_wsgi I have now added a directive which allows one to
enable within a specific context that chunked transfer encoding should
be used for a response when a HTTP/1.1 client is being used. Thus, if
you know the content generated from a resource at a particular URL
within your application would benefit from chunked transfer encoding
on the response, you could use:
<Location /mysite/some/resource>
WSGIOutputChunking On
</Location>
At this stage is probably better than nothing given that WSGI doesn't
provide a way of enabling it.
Graham
More information about the Web-SIG
mailing list