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
This commit is contained in:
lin-hua-cheng 2015-10-06 23:26:08 -07:00
parent 262af5416b
commit 985b2cdd2c

View File

@ -16,6 +16,7 @@
import io import io
import os import os
import six import six
from six.moves import urllib
try: try:
from urllib.parse import urlparse # noqa from urllib.parse import urlparse # noqa
@ -42,8 +43,7 @@ class APIv1(api.BaseAPI):
:returns: :returns:
dict of returned headers dict of returned headers
""" """
response = self.create(urllib.parse.quote(container), method='PUT')
response = self.create(container, method='PUT')
data = { data = {
'account': self._find_account_id(), 'account': self._find_account_id(),
'container': container, 'container': container,
@ -63,7 +63,7 @@ class APIv1(api.BaseAPI):
""" """
if container: if container:
self.delete(container) self.delete(urllib.parse.quote(container))
def container_list( def container_list(
self, self,
@ -154,7 +154,7 @@ class APIv1(api.BaseAPI):
headers = self._set_properties(properties, 'X-Container-Meta-%s') headers = self._set_properties(properties, 'X-Container-Meta-%s')
if headers: if headers:
self.create(container, headers=headers) self.create(urllib.parse.quote(container), headers=headers)
def container_show( def container_show(
self, self,
@ -168,7 +168,7 @@ class APIv1(api.BaseAPI):
dict of returned headers dict of returned headers
""" """
response = self._request('HEAD', container) response = self._request('HEAD', urllib.parse.quote(container))
data = { data = {
'account': self._find_account_id(), 'account': self._find_account_id(),
'container': container, 'container': container,
@ -201,7 +201,7 @@ class APIv1(api.BaseAPI):
headers = self._unset_properties(properties, headers = self._unset_properties(properties,
'X-Remove-Container-Meta-%s') 'X-Remove-Container-Meta-%s')
if headers: if headers:
self.create(container, headers=headers) self.create(urllib.parse.quote(container), headers=headers)
def object_create( def object_create(
self, self,
@ -222,7 +222,8 @@ class APIv1(api.BaseAPI):
# TODO(dtroyer): What exception to raise here? # TODO(dtroyer): What exception to raise here?
return {} return {}
full_url = "%s/%s" % (container, object) full_url = "%s/%s" % (urllib.parse.quote(container),
urllib.parse.quote(object))
with io.open(object, 'rb') as f: with io.open(object, 'rb') as f:
response = self.create( response = self.create(
full_url, full_url,
@ -255,7 +256,8 @@ class APIv1(api.BaseAPI):
if container is None or object is None: if container is None or object is None:
return return
self.delete("%s/%s" % (container, object)) self.delete("%s/%s" % (urllib.parse.quote(container),
urllib.parse.quote(object)))
def object_list( def object_list(
self, self,
@ -332,7 +334,7 @@ class APIv1(api.BaseAPI):
if delimiter: if delimiter:
params['delimiter'] = delimiter params['delimiter'] = delimiter
return self.list(container, **params) return self.list(urllib.parse.quote(container), **params)
def object_save( def object_save(
self, self,
@ -355,7 +357,8 @@ class APIv1(api.BaseAPI):
response = self._request( response = self._request(
'GET', 'GET',
"%s/%s" % (container, object), "%s/%s" % (urllib.parse.quote(container),
urllib.parse.quote(object)),
stream=True, stream=True,
) )
if response.status_code == 200: if response.status_code == 200:
@ -384,7 +387,9 @@ class APIv1(api.BaseAPI):
headers = self._set_properties(properties, 'X-Object-Meta-%s') headers = self._set_properties(properties, 'X-Object-Meta-%s')
if headers: if headers:
self.create("%s/%s" % (container, object), headers=headers) self.create("%s/%s" % (urllib.parse.quote(container),
urllib.parse.quote(object)),
headers=headers)
def object_unset( def object_unset(
self, self,
@ -404,7 +409,9 @@ class APIv1(api.BaseAPI):
headers = self._unset_properties(properties, 'X-Remove-Object-Meta-%s') headers = self._unset_properties(properties, 'X-Remove-Object-Meta-%s')
if headers: if headers:
self.create("%s/%s" % (container, object), headers=headers) self.create("%s/%s" % (urllib.parse.quote(container),
urllib.parse.quote(object)),
headers=headers)
def object_show( def object_show(
self, self,
@ -424,7 +431,9 @@ class APIv1(api.BaseAPI):
if container is None or object is None: if container is None or object is None:
return {} return {}
response = self._request('HEAD', "%s/%s" % (container, object)) response = self._request('HEAD', "%s/%s" %
(urllib.parse.quote(container),
urllib.parse.quote(object)))
data = { data = {
'account': self._find_account_id(), 'account': self._find_account_id(),
'container': container, 'container': container,