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,
|
||||
prefix, marker=''):
|
||||
con_req = make_subrequest(
|
||||
req.environ, path='/'.join(['', version, account, container]),
|
||||
req.environ,
|
||||
path=quote('/'.join(['', version, account, container])),
|
||||
method='GET',
|
||||
headers={'x-auth-token': req.headers.get('x-auth-token')},
|
||||
agent=('%(orig)s ' + 'DLO MultipartGET'), swift_source='DLO')
|
||||
|
@ -457,8 +457,8 @@ def parse_and_validate_input(req_body, req_path):
|
||||
continue
|
||||
|
||||
obj_path = '/'.join(['', vrs, account,
|
||||
seg_dict['path'].lstrip('/')])
|
||||
if req_path == quote(obj_path):
|
||||
quote(seg_dict['path'].lstrip('/'))])
|
||||
if req_path == obj_path:
|
||||
errors.append(
|
||||
b"Index %d: manifest must not include itself as a segment"
|
||||
% seg_index)
|
||||
@ -526,7 +526,7 @@ class SloGetContext(WSGIContext):
|
||||
Raise exception on failures.
|
||||
"""
|
||||
sub_req = make_subrequest(
|
||||
req.environ, path='/'.join(['', version, acc, con, obj]),
|
||||
req.environ, path=quote('/'.join(['', version, acc, con, obj])),
|
||||
method='GET',
|
||||
headers={'x-auth-token': req.headers.get('x-auth-token')},
|
||||
agent='%(orig)s SLO MultipartGET', swift_source='SLO')
|
||||
@ -1109,8 +1109,8 @@ class StaticLargeObject(object):
|
||||
path2indices[seg_dict['path']].append(index)
|
||||
|
||||
def do_head(obj_name):
|
||||
obj_path = '/'.join(['', vrs, account,
|
||||
get_valid_utf8_str(obj_name).lstrip('/')])
|
||||
obj_path = quote('/'.join([
|
||||
'', vrs, account, get_valid_utf8_str(obj_name).lstrip('/')]))
|
||||
|
||||
sub_req = make_subrequest(
|
||||
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, \
|
||||
close_if_possible, maybe_multipart_byteranges_to_document_iters, \
|
||||
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
|
||||
|
||||
@ -389,7 +389,7 @@ class SegmentedIterable(object):
|
||||
# segment is a plain old object, not some flavor of large
|
||||
# object; therefore, its etag is its MD5sum and hence we can
|
||||
# check it.
|
||||
path = seg_path + '?multipart-manifest=get'
|
||||
path = quote(seg_path) + '?multipart-manifest=get'
|
||||
seg_req = make_subrequest(
|
||||
self.req.environ, path=path, method='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.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)
|
||||
|
||||
for letter in ('f', 'g', 'h', 'i', 'j'):
|
||||
@ -64,7 +65,7 @@ class TestDloEnv(BaseEnv):
|
||||
|
||||
man2 = cls.container.file("man2")
|
||||
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)})
|
||||
|
||||
manall = cls.container.file("manall")
|
||||
|
@ -96,6 +96,8 @@ class TestSloEnv(BaseEnv):
|
||||
seg_info['seg_e']]),
|
||||
parms={'multipart-manifest': 'put'})
|
||||
|
||||
cls.container.file('seg_with_%ff_funky_name').write('z' * 10)
|
||||
|
||||
# Put the same manifest in the container2
|
||||
file_item = cls.container2.file("manifest-abcde")
|
||||
file_item.write(
|
||||
@ -564,6 +566,17 @@ class TestSlo(Base):
|
||||
parms={'multipart-manifest': 'put'})
|
||||
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):
|
||||
file_item = self.env.container.file("manifest-a-missing-etag")
|
||||
file_item.write(
|
||||
|
Loading…
Reference in New Issue
Block a user