Mercurial > hg > mercurial-source
changeset 36772:98a00aa0288d
wireprotoserver: move error response handling out of hgweb
The exception handler for ErrorResponse has more to do with the
wire protocol than the generic HTTP server. Move the code so it
lives alongside other wire protocol code.
Differential Revision: https://phab.mercurial-scm.org/D2021
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 31 Jan 2018 17:34:45 -0800 |
parents | e69e65b2b4a9 |
children | 6010fe1da619 |
files | mercurial/hgweb/hgweb_mod.py mercurial/wireprotoserver.py |
diffstat | 2 files changed, 18 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/hgweb/hgweb_mod.py +++ b/mercurial/hgweb/hgweb_mod.py @@ -369,18 +369,7 @@ if cmd in perms: self.check_perm(rctx, req, perms[cmd]) except ErrorResponse as inst: - # A client that sends unbundle without 100-continue will - # break if we respond early. - if (cmd == 'unbundle' and - (req.env.get('HTTP_EXPECT', - '').lower() != '100-continue') or - req.env.get('X-HgHttp2', '')): - req.drain() - else: - req.headers.append((r'Connection', r'Close')) - req.respond(inst, wireprotoserver.HGTYPE, - body='0\n%s\n' % inst) - return '' + return protohandler['handleerror'](inst) return protohandler['dispatch']()
--- a/mercurial/wireprotoserver.py +++ b/mercurial/wireprotoserver.py @@ -242,6 +242,7 @@ 'cmd': cmd, 'proto': proto, 'dispatch': lambda: _callhttp(repo, req, proto, cmd), + 'handleerror': lambda ex: _handlehttperror(ex, req, cmd), } def _callhttp(repo, req, proto, cmd): @@ -303,6 +304,22 @@ return [] raise error.ProgrammingError('hgweb.protocol internal failure', rsp) +def _handlehttperror(e, req, cmd): + """Called when an ErrorResponse is raised during HTTP request processing.""" + # A client that sends unbundle without 100-continue will + # break if we respond early. + if (cmd == 'unbundle' and + (req.env.get('HTTP_EXPECT', + '').lower() != '100-continue') or + req.env.get('X-HgHttp2', '')): + req.drain() + else: + req.headers.append((r'Connection', r'Close')) + + req.respond(e, HGTYPE, body='0\n%s\n' % e) + + return '' + class sshserver(abstractserverproto): def __init__(self, ui, repo): self._ui = ui