[Web-SIG] a possible error in the WSGI spec
Phillip J. Eby
pje at telecommunity.com
Thu Dec 20 17:43:58 CET 2007
At 01:27 PM 12/20/2007 +0100, Manlio Perillo wrote:
>It seems that there is a little error in the WSGI spec.
>In the "Specification Details" chapter there is this note:
>"""(Note: the application must invoke the start_response() callable
>before the iterable yields its first body string, so that the server can
>send the headers before any body content. However, this invocation may
>be performed by the iterable's first iteration, so servers must not
>assume that start_response() has been called before they begin iterating
>over the iterable.)"""
>What's wrong is that the invocation of start_response may be performed
>at any iteration of the iterable, as long as the application yields
You're right - the intent here was before the iterable yields its
first non-empty body string.
>There is also a little problem in the "The start_response() Callable"
>chapter, in this phrase:
>"""The start_response callable must not actually transmit the response
>headers. Instead, it must store them for the server or gateway to
>transmit only after the first iteration of the application return value
>that yields a non-empty string, or upon the application's first
>invocation of the write() callable"""
> From this it seems that the response headers should be transmitted
>after the first invocation of the write() callable, even if it returns
>an empty string, but this is in contradiction with the following phrase:
>"""In other words, response headers must not be sent until there is
>actual body data available, or until the application's returned iterable
There is no sane reason to call write() with an empty string, so I
don't really see a conflict here.
Please note that both write() and iteration in the normal case should
be sending the entire response body in a single call or
yield. Multiple yields or write() calls should ONLY be used when
streaming output is *required*: i.e. server push or sending large files.
(In addition, write() is intended strictly for legacy apps and
frameworks only; new code should use iteration only, especially as
WSGI 2 will drop the start_response() and write() functions altogether.)
More information about the Web-SIG