comparison mercurial/wireprotoserver.py @ 35986: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 cdc93fe1da77
children 6010fe1da619
comparison
equal deleted inserted replaced
35985:e69e65b2b4a9 35986:98a00aa0288d
240 240
241 return { 241 return {
242 'cmd': cmd, 242 'cmd': cmd,
243 'proto': proto, 243 'proto': proto,
244 'dispatch': lambda: _callhttp(repo, req, proto, cmd), 244 'dispatch': lambda: _callhttp(repo, req, proto, cmd),
245 'handleerror': lambda ex: _handlehttperror(ex, req, cmd),
245 } 246 }
246 247
247 def _callhttp(repo, req, proto, cmd): 248 def _callhttp(repo, req, proto, cmd):
248 def genversion2(gen, engine, engineopts): 249 def genversion2(gen, engine, engineopts):
249 # application/mercurial-0.2 always sends a payload header 250 # application/mercurial-0.2 always sends a payload header
300 elif isinstance(rsp, wireproto.ooberror): 301 elif isinstance(rsp, wireproto.ooberror):
301 rsp = rsp.message 302 rsp = rsp.message
302 req.respond(HTTP_OK, HGERRTYPE, body=rsp) 303 req.respond(HTTP_OK, HGERRTYPE, body=rsp)
303 return [] 304 return []
304 raise error.ProgrammingError('hgweb.protocol internal failure', rsp) 305 raise error.ProgrammingError('hgweb.protocol internal failure', rsp)
306
307 def _handlehttperror(e, req, cmd):
308 """Called when an ErrorResponse is raised during HTTP request processing."""
309 # A client that sends unbundle without 100-continue will
310 # break if we respond early.
311 if (cmd == 'unbundle' and
312 (req.env.get('HTTP_EXPECT',
313 '').lower() != '100-continue') or
314 req.env.get('X-HgHttp2', '')):
315 req.drain()
316 else:
317 req.headers.append((r'Connection', r'Close'))
318
319 req.respond(e, HGTYPE, body='0\n%s\n' % e)
320
321 return ''
305 322
306 class sshserver(abstractserverproto): 323 class sshserver(abstractserverproto):
307 def __init__(self, ui, repo): 324 def __init__(self, ui, repo):
308 self._ui = ui 325 self._ui = ui
309 self._repo = repo 326 self._repo = repo