Fix quoting for large objects
Change-Id: I46bdb6da8f778a6c86e0f8e883b52fc31e9fd44e Partial-Bug: 1774238 Closes-Bug: 1678022 Closes-Bug: 1598093 Closes-Bug: 1762997
This commit is contained in:
parent
a30a477755
commit
fa678949ae
@ -144,7 +144,8 @@ class GetContext(WSGIContext):
|
|||||||
def _get_container_listing(self, req, version, account, container,
|
def _get_container_listing(self, req, version, account, container,
|
||||||
prefix, marker=''):
|
prefix, marker=''):
|
||||||
con_req = make_subrequest(
|
con_req = make_subrequest(
|
||||||
req.environ, path='/'.join(['', version, account, container]),
|
req.environ,
|
||||||
|
path=quote('/'.join(['', version, account, container])),
|
||||||
method='GET',
|
method='GET',
|
||||||
headers={'x-auth-token': req.headers.get('x-auth-token')},
|
headers={'x-auth-token': req.headers.get('x-auth-token')},
|
||||||
agent=('%(orig)s ' + 'DLO MultipartGET'), swift_source='DLO')
|
agent=('%(orig)s ' + 'DLO MultipartGET'), swift_source='DLO')
|
||||||
|
@ -457,8 +457,8 @@ def parse_and_validate_input(req_body, req_path):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
obj_path = '/'.join(['', vrs, account,
|
obj_path = '/'.join(['', vrs, account,
|
||||||
seg_dict['path'].lstrip('/')])
|
quote(seg_dict['path'].lstrip('/'))])
|
||||||
if req_path == quote(obj_path):
|
if req_path == obj_path:
|
||||||
errors.append(
|
errors.append(
|
||||||
b"Index %d: manifest must not include itself as a segment"
|
b"Index %d: manifest must not include itself as a segment"
|
||||||
% seg_index)
|
% seg_index)
|
||||||
@ -526,7 +526,7 @@ class SloGetContext(WSGIContext):
|
|||||||
Raise exception on failures.
|
Raise exception on failures.
|
||||||
"""
|
"""
|
||||||
sub_req = make_subrequest(
|
sub_req = make_subrequest(
|
||||||
req.environ, path='/'.join(['', version, acc, con, obj]),
|
req.environ, path=quote('/'.join(['', version, acc, con, obj])),
|
||||||
method='GET',
|
method='GET',
|
||||||
headers={'x-auth-token': req.headers.get('x-auth-token')},
|
headers={'x-auth-token': req.headers.get('x-auth-token')},
|
||||||
agent='%(orig)s SLO MultipartGET', swift_source='SLO')
|
agent='%(orig)s SLO MultipartGET', swift_source='SLO')
|
||||||
@ -1109,8 +1109,8 @@ class StaticLargeObject(object):
|
|||||||
path2indices[seg_dict['path']].append(index)
|
path2indices[seg_dict['path']].append(index)
|
||||||
|
|
||||||
def do_head(obj_name):
|
def do_head(obj_name):
|
||||||
obj_path = '/'.join(['', vrs, account,
|
obj_path = quote('/'.join([
|
||||||
get_valid_utf8_str(obj_name).lstrip('/')])
|
'', vrs, account, get_valid_utf8_str(obj_name).lstrip('/')]))
|
||||||
|
|
||||||
sub_req = make_subrequest(
|
sub_req = make_subrequest(
|
||||||
req.environ, path=obj_path + '?', # kill the query string
|
req.environ, path=obj_path + '?', # kill the query string
|
||||||
|
@ -38,7 +38,7 @@ from swift.common.swob import HTTPBadRequest, \
|
|||||||
from swift.common.utils import split_path, validate_device_partition, \
|
from swift.common.utils import split_path, validate_device_partition, \
|
||||||
close_if_possible, maybe_multipart_byteranges_to_document_iters, \
|
close_if_possible, maybe_multipart_byteranges_to_document_iters, \
|
||||||
multipart_byteranges_to_document_iters, parse_content_type, \
|
multipart_byteranges_to_document_iters, parse_content_type, \
|
||||||
parse_content_range, csv_append, list_from_csv, Spliterator
|
parse_content_range, csv_append, list_from_csv, Spliterator, quote
|
||||||
|
|
||||||
from swift.common.wsgi import make_subrequest
|
from swift.common.wsgi import make_subrequest
|
||||||
|
|
||||||
@ -389,7 +389,7 @@ class SegmentedIterable(object):
|
|||||||
# segment is a plain old object, not some flavor of large
|
# segment is a plain old object, not some flavor of large
|
||||||
# object; therefore, its etag is its MD5sum and hence we can
|
# object; therefore, its etag is its MD5sum and hence we can
|
||||||
# check it.
|
# check it.
|
||||||
path = seg_path + '?multipart-manifest=get'
|
path = quote(seg_path) + '?multipart-manifest=get'
|
||||||
seg_req = make_subrequest(
|
seg_req = make_subrequest(
|
||||||
self.req.environ, path=path, method='GET',
|
self.req.environ, path=path, method='GET',
|
||||||
headers={'x-auth-token': self.req.headers.get(
|
headers={'x-auth-token': self.req.headers.get(
|
||||||
|
@ -49,7 +49,8 @@ class TestDloEnv(BaseEnv):
|
|||||||
file_item = cls.container.file("%s/seg_lower%s" % (prefix, letter))
|
file_item = cls.container.file("%s/seg_lower%s" % (prefix, letter))
|
||||||
file_item.write(letter * 10)
|
file_item.write(letter * 10)
|
||||||
|
|
||||||
file_item = cls.container.file("%s/seg_upper%s" % (prefix, letter))
|
file_item = cls.container.file(
|
||||||
|
"%s/seg_upper_%%ff%s" % (prefix, letter))
|
||||||
file_item.write(letter.upper() * 10)
|
file_item.write(letter.upper() * 10)
|
||||||
|
|
||||||
for letter in ('f', 'g', 'h', 'i', 'j'):
|
for letter in ('f', 'g', 'h', 'i', 'j'):
|
||||||
@ -64,7 +65,7 @@ class TestDloEnv(BaseEnv):
|
|||||||
|
|
||||||
man2 = cls.container.file("man2")
|
man2 = cls.container.file("man2")
|
||||||
man2.write('man2-contents',
|
man2.write('man2-contents',
|
||||||
hdrs={"X-Object-Manifest": "%s/%s/seg_upper" %
|
hdrs={"X-Object-Manifest": "%s/%s/seg_upper_%%25ff" %
|
||||||
(cls.container.name, prefix)})
|
(cls.container.name, prefix)})
|
||||||
|
|
||||||
manall = cls.container.file("manall")
|
manall = cls.container.file("manall")
|
||||||
|
@ -96,6 +96,8 @@ class TestSloEnv(BaseEnv):
|
|||||||
seg_info['seg_e']]),
|
seg_info['seg_e']]),
|
||||||
parms={'multipart-manifest': 'put'})
|
parms={'multipart-manifest': 'put'})
|
||||||
|
|
||||||
|
cls.container.file('seg_with_%ff_funky_name').write('z' * 10)
|
||||||
|
|
||||||
# Put the same manifest in the container2
|
# Put the same manifest in the container2
|
||||||
file_item = cls.container2.file("manifest-abcde")
|
file_item = cls.container2.file("manifest-abcde")
|
||||||
file_item.write(
|
file_item.write(
|
||||||
@ -564,6 +566,17 @@ class TestSlo(Base):
|
|||||||
parms={'multipart-manifest': 'put'})
|
parms={'multipart-manifest': 'put'})
|
||||||
self.assert_status(201)
|
self.assert_status(201)
|
||||||
|
|
||||||
|
def test_slo_funky_segment(self):
|
||||||
|
file_item = self.env.container.file("manifest-with-funky-segment")
|
||||||
|
file_item.write(
|
||||||
|
json.dumps([{
|
||||||
|
'path': '/%s/%s' % (self.env.container.name,
|
||||||
|
'seg_with_%ff_funky_name')}]),
|
||||||
|
parms={'multipart-manifest': 'put'})
|
||||||
|
self.assert_status(201)
|
||||||
|
|
||||||
|
self.assertEqual('z' * 10, file_item.read())
|
||||||
|
|
||||||
def test_slo_missing_etag(self):
|
def test_slo_missing_etag(self):
|
||||||
file_item = self.env.container.file("manifest-a-missing-etag")
|
file_item = self.env.container.file("manifest-a-missing-etag")
|
||||||
file_item.write(
|
file_item.write(
|
||||||
|
Loading…
Reference in New Issue
Block a user