[Web-SIG] Another WSGI gotcha to be aware of
Robert Brewer
fumanchu at aminus.org
Sat Aug 25 08:45:03 CEST 2007
Hi all,
I just found another corner case in the WSGI spec
that I thought I'd share so you all can check your
WSGI components for similar problems. Basically,
it comes down to error handling. Here's a simple
example:
class Middleware(object):
def __init__(self, nextapp, environ, start_response):
try:
self.response = nextapp(environ, start_response)
self.iter_response = iter(self.response)
return
except SomeException:
self.close()
def close(self):
if hasattr(self.response, "close"):
self.response.close()
def __iter__(self):
return self
def next(self):
try:
return self.iter_response.next()
except AnotherException:
self.close()
raise StopIteration
As you know, all WSGI middleware (that doesn't just pass
through the response from "nextapp") must itself possess
a "close" method so that the response from "nextapp" can
have *its* close method called. In this example, that
would be "self.response.close".
However, and here's the rub, if nextapp() raises an
exception, **self.response is never bound**, and
therefore we have no handle to the object we need
to close. Note that this is not a middleware-only
problem; servers can run into this too.
The spec says, "In general, applications *should* try to
trap their own, internal errors"; we might want to make
that a MUST in future versions. Alternately, we could
require that every application provide its resource-
releasing endpoint via some means other than a successful
response. I'm sure you all can come up with other solutions.
Robert Brewer
fumanchu at aminus.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/web-sig/attachments/20070824/e9f7a2a7/attachment.htm
More information about the Web-SIG
mailing list