[Web-SIG] WSGI Open Space @ PyCon.

Ionel Maries Cristian ionel.mc at gmail.com
Mon Mar 30 13:01:56 CEST 2009


On Mon, Mar 30, 2009 at 03:13, Graham Dumpleton
<graham.dumpleton at gmail.com> wrote:
[...]

> The problem with this is what happens if a WSGI middleware tries to do
> something with it. If the separate change is made to allow string like
> objects to be returned instead of only string objects, then its string
> like behaviour could be to appear like an empty string. Thus a
> middleware would see it as an empty string. Of course, the WSGI
> middleware then may suppress it and not pass it back down the line.
>
> As with wsgi.file_wrapper, the problem is that only the WSGI adapter
> really knows what the type of the iterable instance being returned is,
> a WSGI middleware can't work it out, except maybe by creating a dummy
> instance of one and comparing the types. Even then, that may not be
> guaranteed.
>
> This therefore makes it hard for a WSGI middleware to even detect such
> special control/meta elements and simply pass them through. That also
> wouldn't work anyway, as a WSGI middleware could be trying to combine
> together all the strings into one big string to stick a content length
> on it. In that case it isn't going to even know that a special control
> element is saying that it should stop trying to do that and instead
> flush out what it has already accumulated so that underlying server
> can do other stuff while waiting for file descriptor to be ready.
>
> A WSGI middleware doing this sort of thing is going to screw you up
> even if empty string as might be getting used for this purpose now. In
> short, I can't see how you can do it this way, as you have no
> guarantee that a WSGI middleware will not hold on to it. Thus never
> gets back to underlying WSGI adapter.
>

That's wrong - middleware should not eat up response chunks.

To quote the wsgi spec:
       To put this requirement another way, a middleware component
       must yield at least one value each time its underlying application
       yields a value. If the middleware cannot yield any other value,
       it must yield an empty string.
See:
http://www.python.org/dev/peps/pep-0333/#middleware-handling-of-block-boundaries


-- ionel


More information about the Web-SIG mailing list