Patchwork D2021: wireprotoserver: move error response handling out of hgweb

login
register
mail settings
Submitter phabricator
Date Feb. 3, 2018, 1:50 a.m.
Message ID <differential-rev-PHID-DREV-fpvra32hg6tthrhmwsof-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/27251/
State Superseded
Headers show

Comments

phabricator - Feb. 3, 2018, 1:50 a.m.
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




To: indygreg, #hg-reviewers
Cc: mercurial-devel

Patch

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']()