Index: nevow/test/test_appserver.py =================================================================== --- nevow/test/test_appserver.py (revision 18026) +++ nevow/test/test_appserver.py (working copy) @@ -94,6 +94,7 @@ lambda : self.fail(), asserterr) +from twisted.internet import defer class TestSiteAndRequest(testutil.TestCase): def renderResource(self, resource, path): @@ -130,6 +131,19 @@ return self.renderResource(Res1(), 'bar').addCallback( lambda result: self.assertEquals(result, 'world')) + def test_connectionLost(self): + d = defer.Deferred() + class Res(Render): + def renderHTTP(self, ctx): + return d + s = appserver.NevowSite(Res()) + r = appserver.NevowRequest(testutil.FakeChannel(s), True) + r.path = 'boo' + r.process() + r.connectionLost(Exception('Just Testing')) + d.callback('finished') + + from twisted.internet import protocol, address class FakeTransport(protocol.FileWrapper): Index: nevow/appserver.py =================================================================== --- nevow/appserver.py (revision 18026) +++ nevow/appserver.py (working copy) @@ -120,7 +120,13 @@ def __init__(self, *args, **kw): server.Request.__init__(self, *args, **kw) tpc.Componentized.__init__(self) + self._lostConnection = False + def flagLostConnection(err): + self._lostConnection = True + + self.notifyFinish().addErrback(flagLostConnection) + def process(self): # extra request parsing if self.method == 'POST': @@ -173,10 +179,13 @@ self.deferred.callback("") def finishRequest( self, success ): - server.Request.finish(self) + if not self._lostConnection: + server.Request.finish(self) def _cbFinishRender(self, html, ctx): - if isinstance(html, str): + if self._lostConnection: + pass + elif isinstance(html, str): self.write(html) self.finishRequest( True ) elif html is errorMarker: