diff options
author | Zuul <zuul@review.opendev.org> | 2020-04-25 02:07:18 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2020-04-25 02:07:18 +0000 |
commit | eecdcdefbc2c2c0a1c6720ee324d95875a92ea0d (patch) | |
tree | 096e081e382175d516a8fd6824f3cd8dbe1032ce | |
parent | e44ca6d8af33d5f84b8c2c6c19c40b6c681c68fe (diff) | |
parent | 947c09f30c6b603e3f4da060bc913407b158a0ca (diff) | |
download | python-swiftclient-eecdcdefbc2c2c0a1c6720ee324d95875a92ea0d.tar.gz |
Merge "Fixed capability discovery endpoint hardcode"
-rw-r--r-- | swiftclient/client.py | 17 | ||||
-rw-r--r-- | test/unit/test_swiftclient.py | 32 |
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: |