##// END OF EJS Templates
http: Add error handling for the repo-locked exception. Part of #4237...
Martin Bornhold -
r85:a0c3f57b default
parent child Browse files
Show More
@@ -25,6 +25,7 b' different error conditions.'
25 25 """
26 26
27 27 import functools
28 from pyramid.httpexceptions import HTTPLocked
28 29
29 30
30 31 def _make_exception(kind, *args):
@@ -54,3 +55,14 b' RequirementException = functools.partial'
54 55 UnhandledException = functools.partial(_make_exception, 'unhandled')
55 56
56 57 URLError = functools.partial(_make_exception, 'url_error')
58
59
60 class HTTPRepoLocked(HTTPLocked):
61 """
62 Subclass of HTTPLocked response that allows to set the title and status
63 code via constructor arguments.
64 """
65 def __init__(self, title, status_code=None, **kwargs):
66 self.code = status_code or HTTPLocked.code
67 self.title = title
68 super(HTTPRepoLocked, self).__init__(**kwargs)
@@ -31,6 +31,7 b' from pyramid.wsgi import wsgiapp'
31 31 from vcsserver import remote_wsgi, scm_app, settings, hgpatches
32 32 from vcsserver.echo_stub import remote_wsgi as remote_wsgi_stub
33 33 from vcsserver.echo_stub.echo_app import EchoApp
34 from vcsserver.exceptions import HTTPRepoLocked
34 35 from vcsserver.server import VcsServer
35 36
36 37 try:
@@ -197,6 +198,9 b' class HTTPApplication(object):'
197 198
198 199 self.config.add_view(self.hg_stream(), route_name='stream_hg')
199 200 self.config.add_view(self.git_stream(), route_name='stream_git')
201 self.config.add_view(
202 self.handle_vcs_exception, context=Exception,
203 custom_predicates=[self.is_vcs_exception])
200 204
201 205 def wsgi_app(self):
202 206 return self.config.make_wsgi_app()
@@ -317,6 +321,23 b' class HTTPApplication(object):'
317 321 return app(environ, start_response)
318 322 return _git_stream
319 323
324 def is_vcs_exception(self, context, request):
325 """
326 View predicate that returns true if the context object is a VCS
327 exception.
328 """
329 return hasattr(context, '_vcs_kind')
330
331 def handle_vcs_exception(self, exception, request):
332 if exception._vcs_kind == 'repo_locked':
333 # Get custom repo-locked status code if present.
334 status_code = request.headers.get('X-RC-Locked-Status-Code')
335 return HTTPRepoLocked(
336 title=exception.message, status_code=status_code)
337
338 # Re-raise exception if we can not handle it.
339 raise exception
340
320 341
321 342 class ResponseFilter(object):
322 343
General Comments 0
You need to be logged in to leave comments. Login now