diff --git a/influxdb_client_3/write_client/_sync/rest_client.py b/influxdb_client_3/write_client/_sync/rest_client.py index 76afba9..3516029 100644 --- a/influxdb_client_3/write_client/_sync/rest_client.py +++ b/influxdb_client_3/write_client/_sync/rest_client.py @@ -8,7 +8,7 @@ import ssl import sys from typing import Dict -from urllib.parse import urlencode +from urllib.parse import urlencode, urljoin from influxdb_client_3.write_client.rest import ApiException @@ -121,7 +121,7 @@ def __init__(self, proxy_headers=proxy_headers, ssl_context=ssl_context, **addition_pool_args - ).connection_from_url(url=base_url) + ) else: self.pool_manager = urllib3.PoolManager( num_pools=pools_size, @@ -133,7 +133,7 @@ def __init__(self, key_password=cert_key_password, ssl_context=ssl_context, **addition_pool_args - ).connection_from_url(url=base_url) + ) def request(self, method, url, query_params=None, headers=None, body=None, timeout=None, **urlopen_kw): @@ -152,8 +152,10 @@ def request(self, method, url, query_params=None, headers=None, :meth:`urllib3.request.RequestMethods.request` """ + # Keep support for absolute URLs while constructing full URLs for relative paths. + request_url = url if url.startswith(("http://", "https://")) else urljoin(self.base_url, url) if query_params: - url += '?' + urlencode(query_params) + request_url += '?' + urlencode(query_params) merged_headers = {} if self.default_header: @@ -164,13 +166,13 @@ def request(self, method, url, query_params=None, headers=None, effective_timeout = timeout if timeout is not None else self.timeout if self.debug: - RestClient.log_request(method, url) + RestClient.log_request(method, request_url) RestClient.log_headers(merged_headers, '>>>') RestClient.log_body(body, '>>>') try: r = self.pool_manager.request( - method, url, + method, request_url, body=body, headers=merged_headers, timeout=effective_timeout, diff --git a/tests/test_write_api.py b/tests/test_write_api.py index 7c04385..a1fe40a 100644 --- a/tests/test_write_api.py +++ b/tests/test_write_api.py @@ -11,6 +11,7 @@ from influxdb_client_3 import InfluxDBClient3, InfluxDBError from influxdb_client_3.exceptions import InfluxDBPartialWriteError from influxdb_client_3.version import VERSION +from influxdb_client_3.write_client._sync.rest_client import RestClient from influxdb_client_3.write_client.rest import ApiException _package = "influxdb3-python" @@ -295,6 +296,21 @@ def test_request_arg_timeout(self, mock_request): self.assertEqual(0.1, self.received_timeout_total) self.received_timeout_total = None + @mock.patch("influxdb_client_3.write_client._sync.rest_client.urllib3.ProxyManager") + def test_rest_client_proxy_uses_proxy_manager_instance(self, proxy_manager_cls): + manager = mock.Mock() + manager.request.return_value = response.HTTPResponse(status=200, reason='OK', headers={}, body=b'') + proxy_manager_cls.return_value = manager + + rest = RestClient(base_url='http://localhost:8181', proxy='http://proxy:3128') + self.assertIs(rest.pool_manager, manager) + + rest.request(method='GET', url='/ping') + + manager.request.assert_called_once() + args, _ = manager.request.call_args + self.assertEqual(('GET', 'http://localhost:8181/ping'), args[:2]) + def test_should_gzip(self): client = InfluxDBClient3( host='http://localhost:8181',