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

login
register
mail settings
Submitter phabricator
Date Feb. 6, 2018, 9:04 p.m.
Message ID <1726d59ca0aec740759fb02824b1e189@localhost.localdomain>
Download mbox | patch
Permalink /patch/27388/
State Not Applicable
Headers show

Comments

phabricator - Feb. 6, 2018, 9:04 p.m.
indygreg updated this revision to Diff 5260.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D2021?vs=5175&id=5260

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
@@ -236,6 +236,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):
@@ -297,6 +298,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']()