# HG changeset patch # User Marcin Kuzminski # Date 2017-04-03 11:40:39 # Node ID 23640ce643a3189cbe04dad8a71dc9af9f82cbce # Parent 9c528e45be15bf361793104fd7ed90150e2240e8 svn: escape special chars to allow interactions with non-standard svn paths. - fixes #4306 diff --git a/rhodecode/lib/middleware/simplesvn.py b/rhodecode/lib/middleware/simplesvn.py --- a/rhodecode/lib/middleware/simplesvn.py +++ b/rhodecode/lib/middleware/simplesvn.py @@ -19,8 +19,10 @@ # and proprietary license terms, please see https://rhodecode.com/licenses/ import logging +import urllib from urlparse import urljoin + import requests from webob.exc import HTTPNotAcceptable @@ -55,6 +57,14 @@ class SimpleSvnApp(object): environ['REQUEST_METHOD'], self._get_url(environ['PATH_INFO']), data=data, headers=request_headers) + if response.status_code not in [200, 401]: + if response.status_code >= 500: + log.error('Got SVN response:%s with text:`%s`', + response, response.text) + else: + log.debug('Got SVN response:%s with text:`%s`', + response, response.text) + response_headers = self._get_response_headers(response.headers) start_response( '{} {}'.format(response.status_code, response.reason), @@ -62,8 +72,10 @@ class SimpleSvnApp(object): return response.iter_content(chunk_size=1024) def _get_url(self, path): - return urljoin( + url_path = urljoin( self.config.get('subversion_http_server_url', ''), path) + url_path = urllib.quote(url_path, safe="/:=~+!$,;'") + return url_path def _get_request_headers(self, environ): headers = {}