Merge pull request #1707 from Whamied/etag-no-quote-patch
Added support for multipart upload completion with unquoted etags
This commit is contained in:
commit
0309d1ec39
@ -175,11 +175,14 @@ class FakeMultipart(BaseModel):
|
|||||||
count = 0
|
count = 0
|
||||||
for pn, etag in body:
|
for pn, etag in body:
|
||||||
part = self.parts.get(pn)
|
part = self.parts.get(pn)
|
||||||
if part is None or part.etag != etag:
|
part_etag = None
|
||||||
|
if part is not None:
|
||||||
|
part_etag = part.etag.replace('"', '')
|
||||||
|
etag = etag.replace('"', '')
|
||||||
|
if part is None or part_etag != etag:
|
||||||
raise InvalidPart()
|
raise InvalidPart()
|
||||||
if last is not None and len(last.value) < UPLOAD_PART_MIN_SIZE:
|
if last is not None and len(last.value) < UPLOAD_PART_MIN_SIZE:
|
||||||
raise EntityTooSmall()
|
raise EntityTooSmall()
|
||||||
part_etag = part.etag.replace('"', '')
|
|
||||||
md5s.extend(decode_hex(part_etag)[0])
|
md5s.extend(decode_hex(part_etag)[0])
|
||||||
total.extend(part.value)
|
total.extend(part.value)
|
||||||
last = part
|
last = part
|
||||||
|
@ -225,6 +225,29 @@ def test_multipart_invalid_order():
|
|||||||
bucket.complete_multipart_upload.when.called_with(
|
bucket.complete_multipart_upload.when.called_with(
|
||||||
multipart.key_name, multipart.id, xml).should.throw(S3ResponseError)
|
multipart.key_name, multipart.id, xml).should.throw(S3ResponseError)
|
||||||
|
|
||||||
|
@mock_s3_deprecated
|
||||||
|
@reduced_min_part_size
|
||||||
|
def test_multipart_etag_quotes_stripped():
|
||||||
|
# Create Bucket so that test can run
|
||||||
|
conn = boto.connect_s3('the_key', 'the_secret')
|
||||||
|
bucket = conn.create_bucket('mybucket')
|
||||||
|
|
||||||
|
multipart = bucket.initiate_multipart_upload("the-key")
|
||||||
|
part1 = b'0' * REDUCED_PART_SIZE
|
||||||
|
etag1 = multipart.upload_part_from_file(BytesIO(part1), 1).etag
|
||||||
|
# last part, can be less than 5 MB
|
||||||
|
part2 = b'1'
|
||||||
|
etag2 = multipart.upload_part_from_file(BytesIO(part2), 2).etag
|
||||||
|
# Strip quotes from etags
|
||||||
|
etag1 = etag1.replace('"','')
|
||||||
|
etag2 = etag2.replace('"','')
|
||||||
|
xml = "<Part><PartNumber>{0}</PartNumber><ETag>{1}</ETag></Part>"
|
||||||
|
xml = xml.format(1, etag1) + xml.format(2, etag2)
|
||||||
|
xml = "<CompleteMultipartUpload>{0}</CompleteMultipartUpload>".format(xml)
|
||||||
|
bucket.complete_multipart_upload.when.called_with(
|
||||||
|
multipart.key_name, multipart.id, xml).should_not.throw(S3ResponseError)
|
||||||
|
# we should get both parts as the key contents
|
||||||
|
bucket.get_key("the-key").etag.should.equal(EXPECTED_ETAG)
|
||||||
|
|
||||||
@mock_s3_deprecated
|
@mock_s3_deprecated
|
||||||
@reduced_min_part_size
|
@reduced_min_part_size
|
||||||
|
Loading…
Reference in New Issue
Block a user