summaryrefslogtreecommitdiff
path: root/swiftclient
diff options
context:
space:
mode:
authorTim Burke <tim.burke@gmail.com>2018-06-22 16:49:03 -0700
committerTim Burke <tim.burke@gmail.com>2018-11-09 09:55:30 -0800
commit411ef48e5bca1ed66a2e4dd7ecd8695e2bf6c94e (patch)
tree39b0b0e6f4626135e374d2943392ecb90a4cf2c4 /swiftclient
parent9acdfe0b460048420551bb84fb3cf41fb1e4a67e (diff)
downloadpython-swiftclient-411ef48e5bca1ed66a2e4dd7ecd8695e2bf6c94e.tar.gz
Stop leaking quite so many connections
While investigating the failures when you move func tests to py3, I noticed a whole bunch of ResourceWarning: unclosed <socket.socket ...> noise. This should fix it. While we're at it, make get_capabilities less stupid. Change-Id: I3913e9334090b04a78143e0b70f621aad30fc642 Related-Change: I86d24104033b490a35178fc504d88c1e4a566628
Diffstat (limited to 'swiftclient')
-rw-r--r--swiftclient/client.py28
1 files changed, 16 insertions, 12 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py
index d843aec..049b4af 100644
--- a/swiftclient/client.py
+++ b/swiftclient/client.py
@@ -402,6 +402,7 @@ class HTTPConnection(object):
self.request_session = requests.Session()
# Don't use requests's default headers
self.request_session.headers = None
+ self.resp = None
if self.parsed_url.scheme not in ('http', 'https'):
raise ClientException('Unsupported scheme "%s" in url "%s"'
% (self.parsed_url.scheme, url))
@@ -506,6 +507,11 @@ class HTTPConnection(object):
return self.resp
+ def close(self):
+ if self.resp:
+ self.resp.close()
+ self.request_session.close()
+
def http_connection(*arg, **kwarg):
""":returns: tuple of (parsed url, connection object)"""
@@ -527,6 +533,8 @@ def get_auth_1_0(url, user, key, snet, **kwargs):
conn.request(method, parsed.path, '', headers)
resp = conn.getresponse()
body = resp.read()
+ resp.close()
+ conn.close()
http_log((url, method,), headers, resp, body)
url = resp.getheader('x-storage-url')
@@ -1651,11 +1659,8 @@ class Connection(object):
if (self.http_conn and isinstance(self.http_conn, tuple)
and len(self.http_conn) > 1):
conn = self.http_conn[1]
- if hasattr(conn, 'close') and callable(conn.close):
- # XXX: Our HTTPConnection object has no close, should be
- # trying to close the requests.Session here?
- conn.close()
- self.http_conn = None
+ conn.close()
+ self.http_conn = None
def get_auth(self):
self.url, self.token = get_auth(self.authurl, self.user, self.key,
@@ -1715,10 +1720,10 @@ class Connection(object):
try:
if not self.url or not self.token:
self.url, self.token = self.get_auth()
- self.http_conn = None
+ self.close()
if self.service_auth and not self.service_token:
self.url, self.service_token = self.get_service_auth()
- self.http_conn = None
+ self.close()
self.auth_end_time = time()
if not self.http_conn:
self.http_conn = self.http_connection()
@@ -1908,8 +1913,7 @@ class Connection(object):
url = url or self.url
if not url:
url, _ = self.get_auth()
- scheme = urlparse(url).scheme
- netloc = urlparse(url).netloc
- url = scheme + '://' + netloc + '/info'
- http_conn = self.http_connection(url)
- return get_capabilities(http_conn)
+ parsed = urlparse(urljoin(url, '/info'))
+ if not self.http_conn:
+ self.http_conn = self.http_connection(url)
+ return get_capabilities((parsed, self.http_conn[1]))