Skip to content

Commit 985b2cd

Browse files
committed
Fix non-ascii issue with object commands
Escape the container and object name whenever it is used as URL. Change-Id: I2343c1e67843ab53773b3fca6e258dc329cd9573 Closes-Bug: #1503508
1 parent 262af54 commit 985b2cd

1 file changed

Lines changed: 22 additions & 13 deletions

File tree

openstackclient/api/object_store_v1.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io
1717
import os
1818
import six
19+
from six.moves import urllib
1920

2021
try:
2122
from urllib.parse import urlparse # noqa
@@ -42,8 +43,7 @@ def container_create(
4243
:returns:
4344
dict of returned headers
4445
"""
45-
46-
response = self.create(container, method='PUT')
46+
response = self.create(urllib.parse.quote(container), method='PUT')
4747
data = {
4848
'account': self._find_account_id(),
4949
'container': container,
@@ -63,7 +63,7 @@ def container_delete(
6363
"""
6464

6565
if container:
66-
self.delete(container)
66+
self.delete(urllib.parse.quote(container))
6767

6868
def container_list(
6969
self,
@@ -154,7 +154,7 @@ def container_set(
154154

155155
headers = self._set_properties(properties, 'X-Container-Meta-%s')
156156
if headers:
157-
self.create(container, headers=headers)
157+
self.create(urllib.parse.quote(container), headers=headers)
158158

159159
def container_show(
160160
self,
@@ -168,7 +168,7 @@ def container_show(
168168
dict of returned headers
169169
"""
170170

171-
response = self._request('HEAD', container)
171+
response = self._request('HEAD', urllib.parse.quote(container))
172172
data = {
173173
'account': self._find_account_id(),
174174
'container': container,
@@ -201,7 +201,7 @@ def container_unset(
201201
headers = self._unset_properties(properties,
202202
'X-Remove-Container-Meta-%s')
203203
if headers:
204-
self.create(container, headers=headers)
204+
self.create(urllib.parse.quote(container), headers=headers)
205205

206206
def object_create(
207207
self,
@@ -222,7 +222,8 @@ def object_create(
222222
# TODO(dtroyer): What exception to raise here?
223223
return {}
224224

225-
full_url = "%s/%s" % (container, object)
225+
full_url = "%s/%s" % (urllib.parse.quote(container),
226+
urllib.parse.quote(object))
226227
with io.open(object, 'rb') as f:
227228
response = self.create(
228229
full_url,
@@ -255,7 +256,8 @@ def object_delete(
255256
if container is None or object is None:
256257
return
257258

258-
self.delete("%s/%s" % (container, object))
259+
self.delete("%s/%s" % (urllib.parse.quote(container),
260+
urllib.parse.quote(object)))
259261

260262
def object_list(
261263
self,
@@ -332,7 +334,7 @@ def object_list(
332334
if delimiter:
333335
params['delimiter'] = delimiter
334336

335-
return self.list(container, **params)
337+
return self.list(urllib.parse.quote(container), **params)
336338

337339
def object_save(
338340
self,
@@ -355,7 +357,8 @@ def object_save(
355357

356358
response = self._request(
357359
'GET',
358-
"%s/%s" % (container, object),
360+
"%s/%s" % (urllib.parse.quote(container),
361+
urllib.parse.quote(object)),
359362
stream=True,
360363
)
361364
if response.status_code == 200:
@@ -384,7 +387,9 @@ def object_set(
384387

385388
headers = self._set_properties(properties, 'X-Object-Meta-%s')
386389
if headers:
387-
self.create("%s/%s" % (container, object), headers=headers)
390+
self.create("%s/%s" % (urllib.parse.quote(container),
391+
urllib.parse.quote(object)),
392+
headers=headers)
388393

389394
def object_unset(
390395
self,
@@ -404,7 +409,9 @@ def object_unset(
404409

405410
headers = self._unset_properties(properties, 'X-Remove-Object-Meta-%s')
406411
if headers:
407-
self.create("%s/%s" % (container, object), headers=headers)
412+
self.create("%s/%s" % (urllib.parse.quote(container),
413+
urllib.parse.quote(object)),
414+
headers=headers)
408415

409416
def object_show(
410417
self,
@@ -424,7 +431,9 @@ def object_show(
424431
if container is None or object is None:
425432
return {}
426433

427-
response = self._request('HEAD', "%s/%s" % (container, object))
434+
response = self._request('HEAD', "%s/%s" %
435+
(urllib.parse.quote(container),
436+
urllib.parse.quote(object)))
428437
data = {
429438
'account': self._find_account_id(),
430439
'container': container,

0 commit comments

Comments
 (0)