diff options
author | Pavlo Shchelokovskyy <shchelokovskyy@gmail.com> | 2021-02-23 14:16:37 +0000 |
---|---|---|
committer | Cyril Roelandt <cyril@redhat.com> | 2022-08-04 17:33:15 +0000 |
commit | 951a9f535e18571d82f1dbe30e94740601f84ffe (patch) | |
tree | bf21baea78876457df6b8002bacdc67a6637d0b3 /glance_store | |
parent | 6851cab51a3d5dbf018f755efee8e0e640ac12ab (diff) | |
download | glance_store-951a9f535e18571d82f1dbe30e94740601f84ffe.tar.gz |
Do not loose url queries on redirects
when fetching images with http driver, the redirect URL can have
mandatory query in it, which must be kept intact to successfully
fetch the image.
Change-Id: I2a9d4d026b935ea6c5e5a3a46c86f70ce1e39ae7
Closes-Bug: #1633860
Diffstat (limited to 'glance_store')
-rw-r--r-- | glance_store/_drivers/http.py | 13 | ||||
-rw-r--r-- | glance_store/tests/unit/test_http_store.py | 9 |
2 files changed, 20 insertions, 2 deletions
diff --git a/glance_store/_drivers/http.py b/glance_store/_drivers/http.py index 79d3ab7..0d55e4b 100644 --- a/glance_store/_drivers/http.py +++ b/glance_store/_drivers/http.py @@ -105,18 +105,26 @@ class StoreLocation(glance_store.location.StoreLocation): self.user = self.specs.get('user') self.password = self.specs.get('password') self.path = self.specs.get('path') + self.query = self.spec.get('query') def _get_credstring(self): if self.user: return '%s:%s@' % (self.user, self.password) return '' + def _get_query_string(self): + if self.query: + return "?%s" % self.query + return "" + def get_uri(self): - return "%s://%s%s%s" % ( + return "%s://%s%s%s%s" % ( self.scheme, self._get_credstring(), self.netloc, - self.path) + self.path, + self._get_query_string() + ) def parse_uri(self, uri): """ @@ -164,6 +172,7 @@ class StoreLocation(glance_store.location.StoreLocation): self.netloc = netloc self.path = path + self.query = pieces.query def http_response_iterator(conn, response, size): diff --git a/glance_store/tests/unit/test_http_store.py b/glance_store/tests/unit/test_http_store.py index 4eafb88..ca3a9c6 100644 --- a/glance_store/tests/unit/test_http_store.py +++ b/glance_store/tests/unit/test_http_store.py @@ -184,6 +184,15 @@ class TestHttpStore(base.StoreBaseTest, self.assertRaises(exceptions.BadStoreUri, location.get_location_from_uri, uri) + def test_http_store_location_get_uri(self): + """Test for HTTP URI with and without query""" + uris = ["http://netloc/path/to/file.tar.gz" + "http://netloc/path/to/file.tar.gz?query=text", + ] + for uri in uris: + loc = location.get_location_from_uri(uri, conf=self.conf) + self.assertEqual(uri, loc.store_location.get_uri()) + def test_http_get_raises_remote_service_unavailable(self): """Test http store raises RemoteServiceUnavailable.""" uri = "http://netloc/path/to/file.tar.gz" |