diff --git a/swiftclient/client.py b/swiftclient/client.py index 67977ed2..b18241d3 100644 --- a/swiftclient/client.py +++ b/swiftclient/client.py @@ -140,7 +140,8 @@ def encode_meta_headers(headers): class HTTPConnection(object): def __init__(self, url, proxy=None, cacert=None, insecure=False, - ssl_compression=False, default_user_agent=None): + ssl_compression=False, default_user_agent=None, + timeout=None): """ Make an HTTPConnection or HTTPSConnection @@ -160,6 +161,8 @@ def __init__(self, url, proxy=None, cacert=None, insecure=False, may be overridden on a per-request basis by explicitly setting the user-agent header on a call to request(). + :param timeout: socket read timeout value, passed directly to + the requests library. :raises ClientException: Unable to handle protocol scheme """ self.url = url @@ -190,6 +193,8 @@ def __init__(self, url, proxy=None, cacert=None, insecure=False, default_user_agent = \ 'python-swiftclient-%s' % swiftclient_version.version_string self.default_user_agent = default_user_agent + if timeout: + self.requests_args['timeout'] = timeout def _request(self, *arg, **kwarg): """ Final wrapper before requests call, to be patched in tests """ @@ -1155,7 +1160,7 @@ def __init__(self, authurl=None, user=None, key=None, retries=5, starting_backoff=1, max_backoff=64, tenant_name=None, os_options=None, auth_version="1", cacert=None, insecure=False, ssl_compression=True, - retry_on_ratelimit=False): + retry_on_ratelimit=False, timeout=None): """ :param authurl: authentication URL :param user: user name to authenticate as @@ -1208,6 +1213,7 @@ def __init__(self, authurl=None, user=None, key=None, retries=5, self.ssl_compression = ssl_compression self.auth_end_time = 0 self.retry_on_ratelimit = retry_on_ratelimit + self.timeout = timeout def close(self): if (self.http_conn and isinstance(self.http_conn, tuple) @@ -1231,7 +1237,8 @@ def http_connection(self, url=None): return http_connection(url if url else self.url, cacert=self.cacert, insecure=self.insecure, - ssl_compression=self.ssl_compression) + ssl_compression=self.ssl_compression, + timeout=self.timeout) def _add_response_dict(self, target_dict, kwargs): if target_dict is not None and 'response_dict' in kwargs: diff --git a/tests/unit/test_swiftclient.py b/tests/unit/test_swiftclient.py index abf60b4e..0c2a669d 100644 --- a/tests/unit/test_swiftclient.py +++ b/tests/unit/test_swiftclient.py @@ -1464,7 +1464,8 @@ def read(self, *args, **kwargs): return '' def local_http_connection(url, proxy=None, cacert=None, - insecure=False, ssl_compression=True): + insecure=False, ssl_compression=True, + timeout=None): parsed = urlparse(url) return parsed, LocalConnection() diff --git a/tests/unit/utils.py b/tests/unit/utils.py index 3e87ea28..4958c131 100644 --- a/tests/unit/utils.py +++ b/tests/unit/utils.py @@ -220,7 +220,7 @@ def fake_http_connection(*args, **kwargs): on_request = kwargs.get('on_request') def wrapper(url, proxy=None, cacert=None, insecure=False, - ssl_compression=True): + ssl_compression=True, timeout=None): if storage_url: self.assertEqual(storage_url, url)