D2021: wireprotoserver: move error response handling out of hgweb
indygreg (Gregory Szorc)
phabricator at mercurial-scm.org
Sat Feb 3 01:50:54 UTC 2018
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
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.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D2021
AFFECTED FILES
mercurial/hgweb/hgweb_mod.py
mercurial/wireprotoserver.py
CHANGE DETAILS
diff --git a/mercurial/wireprotoserver.py b/mercurial/wireprotoserver.py
--- a/mercurial/wireprotoserver.py
+++ b/mercurial/wireprotoserver.py
@@ -239,6 +239,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):
@@ -300,6 +301,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
diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
--- 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']()
To: indygreg, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list