# HG changeset patch # User Martin Bornhold # Date 2016-09-26 12:52:06 # Node ID 2956cade26d0791cdb7b38edb3ac3ae6e70dc258 # Parent f2758dc81e4e3530c08a07e8600443c27007020c pyro4: Add the custom header `X-RhodeCode-Backend` to the pyro4 backend responses. This custom header sets the SCM backend which is in use. It is used to identify VCS responses in the error handler. VCS responses are skipped during error handling. diff --git a/rhodecode/lib/middleware/simplegit.py b/rhodecode/lib/middleware/simplegit.py --- a/rhodecode/lib/middleware/simplegit.py +++ b/rhodecode/lib/middleware/simplegit.py @@ -76,7 +76,8 @@ class SimpleGit(simplevcs.SimpleVCS): return 'pull' def _create_wsgi_app(self, repo_path, repo_name, config): - return self.scm_app.create_git_wsgi_app(repo_path, repo_name, config) + return self.scm_app.create_git_wsgi_app( + repo_path, repo_name, config, self.SCM) def _create_config(self, extras, repo_name): extras['git_update_server_info'] = utils2.str2bool( diff --git a/rhodecode/lib/middleware/simplehg.py b/rhodecode/lib/middleware/simplehg.py --- a/rhodecode/lib/middleware/simplehg.py +++ b/rhodecode/lib/middleware/simplehg.py @@ -71,7 +71,8 @@ class SimpleHg(simplevcs.SimpleVCS): return 'pull' def _create_wsgi_app(self, repo_path, repo_name, config): - return self.scm_app.create_hg_wsgi_app(repo_path, repo_name, config) + return self.scm_app.create_hg_wsgi_app( + repo_path, repo_name, config, self.SCM) def _create_config(self, extras, repo_name): config = utils.make_db_config(repo=repo_name) diff --git a/rhodecode/lib/middleware/utils/scm_app.py b/rhodecode/lib/middleware/utils/scm_app.py --- a/rhodecode/lib/middleware/utils/scm_app.py +++ b/rhodecode/lib/middleware/utils/scm_app.py @@ -34,7 +34,7 @@ HG_REMOTE_WSGI = None GIT_REMOTE_WSGI = None -def create_git_wsgi_app(repo_path, repo_name, config): +def create_git_wsgi_app(repo_path, repo_name, config, backend): """ Return a WSGI app backed by a remote app to handle Git. @@ -45,10 +45,10 @@ def create_git_wsgi_app(repo_path, repo_ log.error('Pyro server has not been initialized yet') return wsgi_app_caller_client.RemoteAppCaller( - factory, repo_path, repo_name, config) + factory, backend, repo_path, repo_name, config) -def create_hg_wsgi_app(repo_path, repo_name, config): +def create_hg_wsgi_app(repo_path, repo_name, config, backend): """ Return a WSGI app backed by a remote app to handle Mercurial. @@ -60,4 +60,4 @@ def create_hg_wsgi_app(repo_path, repo_n log.error('Pyro server has not been initialized yet') return wsgi_app_caller_client.RemoteAppCaller( - factory, repo_path, repo_name, config) + factory, backend, repo_path, repo_name, config) diff --git a/rhodecode/lib/middleware/utils/scm_app_http.py b/rhodecode/lib/middleware/utils/scm_app_http.py --- a/rhodecode/lib/middleware/utils/scm_app_http.py +++ b/rhodecode/lib/middleware/utils/scm_app_http.py @@ -37,14 +37,14 @@ import rhodecode log = logging.getLogger(__name__) -def create_git_wsgi_app(repo_path, repo_name, config): +def create_git_wsgi_app(repo_path, repo_name, config, backend): url = _vcs_streaming_url() + 'git/' - return VcsHttpProxy(url, repo_path, repo_name, config, 'git') + return VcsHttpProxy(url, repo_path, repo_name, config, backend) -def create_hg_wsgi_app(repo_path, repo_name, config): +def create_hg_wsgi_app(repo_path, repo_name, config, backend): url = _vcs_streaming_url() + 'hg/' - return VcsHttpProxy(url, repo_path, repo_name, config, 'hg') + return VcsHttpProxy(url, repo_path, repo_name, config, backend) def _vcs_streaming_url(): diff --git a/rhodecode/lib/middleware/utils/wsgi_app_caller_client.py b/rhodecode/lib/middleware/utils/wsgi_app_caller_client.py --- a/rhodecode/lib/middleware/utils/wsgi_app_caller_client.py +++ b/rhodecode/lib/middleware/utils/wsgi_app_caller_client.py @@ -56,16 +56,18 @@ class RemoteAppCaller(object): It first cleans the environment, so as to reduce the data transferred. """ - def __init__(self, remote_wsgi, *args, **kwargs): + def __init__(self, remote_wsgi, backend, *args, **kwargs): """ :param remote_wsgi: The remote wsgi object that creates a WSGIAppCaller. This object has to have a handle method, with the signature: handle(environ, start_response, *args, **kwargs) + :param backend: Key (str) of the SCM backend that is in use. :param args: args to be passed to the app creation :param kwargs: kwargs to be passed to the app creation """ self._remote_wsgi = remote_wsgi + self._backend = backend self._args = args self._kwargs = kwargs @@ -92,6 +94,10 @@ class RemoteAppCaller(object): data, status, headers = self._remote_wsgi.handle( clean_environ, input_data, *self._args, **self._kwargs) + # Add custom response header to indicate that this is a VCS response + # and which backend is used. + headers.append(('X-RhodeCode-Backend', self._backend)) + log.debug("Got result from proxy, returning to WSGI container") start_response(status, headers) diff --git a/rhodecode/tests/lib/middleware/mock_scm_app.py b/rhodecode/tests/lib/middleware/mock_scm_app.py --- a/rhodecode/tests/lib/middleware/mock_scm_app.py +++ b/rhodecode/tests/lib/middleware/mock_scm_app.py @@ -27,11 +27,11 @@ for testing purposes. import mock -def create_git_wsgi_app(repo_path, repo_name, config): +def create_git_wsgi_app(repo_path, repo_name, config, backend): return mock_git_wsgi -def create_hg_wsgi_app(repo_path, repo_name, config): +def create_hg_wsgi_app(repo_path, repo_name, config, backend): return mock_hg_wsgi