mercurial/wireprotoserver.py
changeset 35986 98a00aa0288d
parent 35984 cdc93fe1da77
child 35987 6010fe1da619
--- a/mercurial/wireprotoserver.py	Wed Jan 31 16:43:46 2018 -0800
+++ b/mercurial/wireprotoserver.py	Wed Jan 31 17:34:45 2018 -0800
@@ -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