hgweb: don't call sys.exit() in httpservice.run()
If I'm reading the code correctly, `mercurial.server.createservice()`
can return an hgweb service or one of three types of command server
services. The caller then calls `mercurial.server.runservice()`,
passing it the returned service's run method. Only the hgweb service
was calling `sys.exit()`. It has been that way since
8d44649df03b
(refactor ssh server., 2006-06-04). That commit message doesn't
provide any explanation. Let's clean up and have the code follow the
usual return path into the `dispatch` module.
After this patch, there should be no remaining places left where we
call `sys.exit()` except for valid uses in the `dispatch` and `worker`
modules.
Differential Revision: https://phab.mercurial-scm.org/D9272
# A dummy extension that installs an hgweb command that throws an Exception.
from __future__ import absolute_import
from mercurial.hgweb import webcommands
def raiseerror(web):
'''Dummy web command that raises an uncaught Exception.'''
# Simulate an error after partial response.
if b'partialresponse' in web.req.qsparams:
web.res.status = b'200 Script output follows'
web.res.headers[b'Content-Type'] = b'text/plain'
web.res.setbodywillwrite()
list(web.res.sendresponse())
web.res.getbodyfile().write(b'partial content\n')
raise AttributeError('I am an uncaught error!')
def extsetup(ui):
setattr(webcommands, 'raiseerror', raiseerror)
webcommands.__all__.append(b'raiseerror')