[Web-SIG] wsgiref.validate allows wsgi.input.read() with no argument

Graham Dumpleton graham.dumpleton at gmail.com
Fri Dec 12 12:46:38 CET 2008


Just noticed that although WSGI PEP doesn't specifically mention that
argument to read() on wsgi.input is optional, wsgiref.validate allows
calling read() with no argument.

>From wsgiref.validate:

"""
* That wsgi.input is used properly:

  - .read() is called with zero or one argument

class InputWrapper:

    def read(self, *args):
        assert_(len(args) <= 1)
        v = self.input.read(*args)
        assert_(type(v) is type(""))
        return v
"""

Of course, the issue is still that WSGI PEP says:

"""The server is not required to read past the client's specified
Content-Length, and ***is allowed to simulate an end-of-file condition
if the application attempts to read past that point***."""

Thus, simulating end-of-file condition is not mandatory, and so if
something does call read() with no argument, not guaranteed it will
actually return. The problem case here being where HTTP/1.1 request
pipelining is being used and WSGI adapter is using raw socket as
wsgi.input. The socket isn't going to be closed in this case as
potentially another request to yet be sent over same socket. Thus
application call of read() with no arguments will hang until client
decides to close socket connection.

Anyway, I thought it was interesting that wsgiref.validate accepts
that argument read() can be optional. Supports further that this part
of WSGI PEP needs to be clarified and end-of-file condition perhaps
made mandatory.

Graham


More information about the Web-SIG mailing list