summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Kolodyazhny <e0ne@e0ne.info>2020-04-23 19:01:47 +0300
committerIvan Kolodyazhny <e0ne@e0ne.info>2020-04-24 12:50:58 +0300
commit947c09f30c6b603e3f4da060bc913407b158a0ca (patch)
tree1570de0a69ed8ff13904aeb29c9e53cb5fa33f9a
parent77993f242be5a2824cc9524836bea6fa6f77620a (diff)
downloadpython-swiftclient-947c09f30c6b603e3f4da060bc913407b158a0ca.tar.gz
Fixed capability discovery endpoint hardcode
It fixes get_capabilities() method to process correctly endpoints like: 'https://<ip>:<port>/v1', 'https://<ip>:<port>/swift/v1'. Co-Authored-By: Daniel Cech <dcech@mirantis.com> Change-Id: Ib4037d0b49da1bce959947100629370805f510d5 Closes-bug: #1712358
-rw-r--r--swiftclient/client.py17
-rw-r--r--test/unit/test_swiftclient.py32
2 files changed, 47 insertions, 2 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py
index 449b6cd..3c3abc0 100644
--- a/swiftclient/client.py
+++ b/swiftclient/client.py
@@ -45,6 +45,8 @@ AUTH_VERSIONS_V2 = ('2.0', '2', 2)
AUTH_VERSIONS_V3 = ('3.0', '3', 3)
USER_METADATA_TYPE = tuple('x-%s-meta-' % type_ for type_ in
('container', 'account', 'object'))
+URI_PATTERN_INFO = re.compile(r'/info')
+URI_PATTERN_VERSION = re.compile(r'\/v\d+\.?\d*(\/.*)?')
try:
from logging import NullHandler
@@ -1935,11 +1937,22 @@ class Connection(object):
response_dict=response_dict,
headers=headers)
- def get_capabilities(self, url=None):
+ def _map_url(self, url):
url = url or self.url
if not url:
url, _ = self.get_auth()
- parsed = urlparse(urljoin(url, '/info'))
+ scheme, netloc, path, params, query, fragment = urlparse(url)
+ if URI_PATTERN_VERSION.search(path):
+ path = URI_PATTERN_VERSION.sub('/info', path)
+ elif not URI_PATTERN_INFO.search(path):
+ if path.endswith('/'):
+ path += 'info'
+ else:
+ path += '/info'
+ return urlunparse((scheme, netloc, path, params, query, fragment))
+
+ def get_capabilities(self, url=None):
+ parsed = urlparse(self._map_url(url))
if not self.http_conn:
self.http_conn = self.http_connection(url)
return get_capabilities((parsed, self.http_conn[1]))
diff --git a/test/unit/test_swiftclient.py b/test/unit/test_swiftclient.py
index 2d45deb..e3d0742 100644
--- a/test/unit/test_swiftclient.py
+++ b/test/unit/test_swiftclient.py
@@ -2035,6 +2035,38 @@ class TestConnection(MockHttpTest):
self.assertEqual(request['headers']['x-auth-token'],
'tToken')
+ def test_url_mapping(self):
+ conn = c.Connection()
+ uri_versions = {
+ 'http://storage.test.com':
+ 'http://storage.test.com/info',
+ 'http://storage.test.com/':
+ 'http://storage.test.com/info',
+ 'http://storage.test.com/v1':
+ 'http://storage.test.com/info',
+ 'http://storage.test.com/v1/':
+ 'http://storage.test.com/info',
+ 'http://storage.test.com/swift':
+ 'http://storage.test.com/swift/info',
+ 'http://storage.test.com/swift/':
+ 'http://storage.test.com/swift/info',
+ 'http://storage.test.com/v1.0':
+ 'http://storage.test.com/info',
+ 'http://storage.test.com/swift/v1.0':
+ 'http://storage.test.com/swift/info',
+ 'http://storage.test.com/v111':
+ 'http://storage.test.com/info',
+ 'http://storage.test.com/v111/test':
+ 'http://storage.test.com/info',
+ 'http://storage.test.com/v1/test':
+ 'http://storage.test.com/info',
+ 'http://storage.test.com/swift/v1.0/test':
+ 'http://storage.test.com/swift/info',
+ 'http://storage.test.com/v1.0/test':
+ 'http://storage.test.com/info'}
+ for uri_k, uri_v in uri_versions.items():
+ self.assertEqual(conn._map_url(uri_k), uri_v)
+
def test_get_capabilities(self):
conn = c.Connection()
with mock.patch('swiftclient.client.get_capabilities') as get_cap: