Show More
@@ -124,7 +124,7 b' class CurlSession(object):' | |||
|
124 | 124 | # TODO: johbo: I did test with 7.19 of libcurl. This version has |
|
125 | 125 | # trouble with 100 - continue being set in the expect header. This |
|
126 | 126 | # can lead to massive performance drops, switching it off here. |
|
127 | curl.setopt(curl.HTTPHEADER, ["Expect:"]) | |
|
127 | ||
|
128 | 128 | curl.setopt(curl.TCP_NODELAY, True) |
|
129 | 129 | curl.setopt(curl.PROTOCOLS, curl.PROTO_HTTP) |
|
130 | 130 | curl.setopt(curl.USERAGENT, 'RhodeCode HTTP {}'.format(rhodecode.__version__)) |
@@ -132,7 +132,10 b' class CurlSession(object):' | |||
|
132 | 132 | curl.setopt(curl.SSL_VERIFYHOST, 0) |
|
133 | 133 | self._curl = curl |
|
134 | 134 | |
|
135 | def post(self, url, data, allow_redirects=False): | |
|
135 | def post(self, url, data, allow_redirects=False, headers=None): | |
|
136 | headers = headers or {} | |
|
137 | # format is ['header_name1: header_value1', 'header_name2: header_value2']) | |
|
138 | headers_list = ["Expect:"] + ['{}: {}'.format(k, v) for k, v in headers.items()] | |
|
136 | 139 | response_buffer = StringIO() |
|
137 | 140 | |
|
138 | 141 | curl = self._curl |
@@ -141,6 +144,7 b' class CurlSession(object):' | |||
|
141 | 144 | curl.setopt(curl.POSTFIELDS, data) |
|
142 | 145 | curl.setopt(curl.FOLLOWLOCATION, allow_redirects) |
|
143 | 146 | curl.setopt(curl.WRITEDATA, response_buffer) |
|
147 | curl.setopt(curl.HTTPHEADER, headers_list) | |
|
144 | 148 | curl.perform() |
|
145 | 149 | |
|
146 | 150 | status_code = curl.getinfo(pycurl.HTTP_CODE) |
@@ -56,7 +56,11 b' EXCEPTIONS_MAP = {' | |||
|
56 | 56 | |
|
57 | 57 | def _remote_call(url, payload, exceptions_map, session): |
|
58 | 58 | try: |
|
59 | response = session.post(url, data=msgpack.packb(payload)) | |
|
59 | headers = { | |
|
60 | 'X-RC-Method': payload.get('method'), | |
|
61 | 'X-RC-Repo-Name': payload.get('_repo_name') | |
|
62 | } | |
|
63 | response = session.post(url, data=msgpack.packb(payload), headers=headers) | |
|
60 | 64 | except pycurl.error as e: |
|
61 | 65 | msg = '{}. \npycurl traceback: {}'.format(e, traceback.format_exc()) |
|
62 | 66 | raise exceptions.HttpVCSCommunicationError(msg) |
@@ -188,13 +192,16 b' class RemoteRepo(object):' | |||
|
188 | 192 | self._session = remote_maker._session_factory() |
|
189 | 193 | |
|
190 | 194 | cache_repo_id = self._repo_id_sanitizer(repo_id) |
|
195 | _repo_name = self._get_repo_name(config, path) | |
|
191 | 196 | self._cache_region, self._cache_namespace = \ |
|
192 | 197 | remote_maker.init_cache_region(cache_repo_id) |
|
193 | 198 | |
|
194 | 199 | with_wire = with_wire or {} |
|
195 | 200 | |
|
196 | 201 | repo_state_uid = with_wire.get('repo_state_uid') or 'state' |
|
202 | ||
|
197 | 203 | self._wire = { |
|
204 | "_repo_name": _repo_name, | |
|
198 | 205 | "path": path, # repo path |
|
199 | 206 | "repo_id": repo_id, |
|
200 | 207 | "cache_repo_id": cache_repo_id, |
@@ -213,6 +220,10 b' class RemoteRepo(object):' | |||
|
213 | 220 | |
|
214 | 221 | self.cert_dir = get_cert_path(rhodecode.CONFIG.get('__file__')) |
|
215 | 222 | |
|
223 | def _get_repo_name(self, config, path): | |
|
224 | repo_store = config.get('paths', '/') | |
|
225 | return path.split(repo_store)[-1].lstrip('/') | |
|
226 | ||
|
216 | 227 | def _repo_id_sanitizer(self, repo_id): |
|
217 | 228 | pathless = repo_id.replace('/', '__').replace('-', '_') |
|
218 | 229 | return ''.join(char if ord(char) < 128 else '_{}_'.format(ord(char)) for char in pathless) |
@@ -238,6 +249,7 b' class RemoteRepo(object):' | |||
|
238 | 249 | payload = { |
|
239 | 250 | 'id': str(uuid.uuid4()), |
|
240 | 251 | 'method': name, |
|
252 | "_repo_name": wire['_repo_name'], | |
|
241 | 253 | 'params': {'wire': wire, 'args': args, 'kwargs': kwargs} |
|
242 | 254 | } |
|
243 | 255 |
@@ -100,7 +100,8 b' def test_repo_maker_uses_session_for_cla' | |||
|
100 | 100 | 'server_and_port', 'endpoint', 'test_dummy_scm', stub_session_factory) |
|
101 | 101 | repo_maker.example_call() |
|
102 | 102 | stub_session_factory().post.assert_called_with( |
|
103 |
'http://server_and_port/endpoint', data=mock.ANY |
|
|
103 | 'http://server_and_port/endpoint', data=mock.ANY, | |
|
104 | headers={'X-RC-Method': 'example_call', 'X-RC-Repo-Name': None}) | |
|
104 | 105 | |
|
105 | 106 | |
|
106 | 107 | def test_repo_maker_uses_session_for_instance_methods( |
@@ -110,7 +111,8 b' def test_repo_maker_uses_session_for_ins' | |||
|
110 | 111 | repo = repo_maker('stub_path', 'stub_repo_id', config) |
|
111 | 112 | repo.example_call() |
|
112 | 113 | stub_session_factory().post.assert_called_with( |
|
113 |
'http://server_and_port/endpoint', data=mock.ANY |
|
|
114 | 'http://server_and_port/endpoint', data=mock.ANY, | |
|
115 | headers={'X-RC-Method': 'example_call', 'X-RC-Repo-Name': 'stub_path'}) | |
|
114 | 116 | |
|
115 | 117 | |
|
116 | 118 | @mock.patch('rhodecode.lib.vcs.client_http.ThreadlocalSessionFactory') |
General Comments 0
You need to be logged in to leave comments.
Login now