Ticket #4019: report_wsgiapp_error.diff

File report_wsgiapp_error.diff, 2.3 KB (added by osuchw, 12 years ago)

Updated

  • twisted/web/wsgi.py

     
    99__metaclass__ = type
    1010
    1111from urllib import unquote
     12import traceback
    1213
    1314from zope.interface import implements
    1415
    1516from twisted.python.log import msg
    1617from twisted.web.resource import IResource
    1718from twisted.web.server import NOT_DONE_YET
     19from twisted.web.http import RESPONSES, INTERNAL_SERVER_ERROR
    1820
    1921
    2022class _ErrorStream:
     
    299301        This must be called in a non-I/O thread (ie, a WSGI application
    300302        thread).
    301303        """
    302         appIterator = self.application(self.environ, self.startResponse)
    303         for elem in appIterator:
    304             if elem:
    305                 self.write(elem)
    306             if self._requestFinished:
    307                 break
    308         close = getattr(appIterator, 'close', None)
    309         if close is not None:
    310             close()
    311         def wsgiFinish(started):
    312             if not self._requestFinished:
    313                 if not started:
    314                     self._sendResponseHeaders()
     304        try:
     305            appIterator = self.application(self.environ, self.startResponse)
     306        except:
     307            tracestr = traceback.format_exc()
     308            def wsgiReportError(trace):
     309                msg(trace, system="wsgi", isError=True)
     310                self.request.setResponseCode(INTERNAL_SERVER_ERROR)
     311                self.request.write(RESPONSES[INTERNAL_SERVER_ERROR])
    315312                self.request.finish()
    316         self.reactor.callFromThread(wsgiFinish, self.started)
    317         self.started = True
     313            self.reactor.callFromThread(wsgiReportError, tracestr)
     314        else:
     315            for elem in appIterator:
     316                if elem:
     317                    self.write(elem)
     318                if self._requestFinished:
     319                    break
     320            close = getattr(appIterator, 'close', None)
     321            if close is not None:
     322                close()
     323            def wsgiFinish(started):
     324                if not self._requestFinished:
     325                    if not started:
     326                        self._sendResponseHeaders()
     327                    self.request.finish()
     328            self.reactor.callFromThread(wsgiFinish, self.started)
     329            self.started = True
    318330
    319331
    320332