Merge pull request #110 from kouk/multipart-copy

support x-amz-copy-source in multipart uploads
This commit is contained in:
Steve Pulec 2014-03-21 15:50:54 -04:00
commit 2cd5418ffa
2 changed files with 22 additions and 4 deletions

View File

@ -182,6 +182,14 @@ class S3Backend(BaseBackend):
multipart = bucket.multiparts[multipart_id]
return multipart.set_part(part_id, value)
def copy_part(self, dest_bucket_name, multipart_id, part_id,
src_bucket_name, src_key_name):
src_key_name = clean_key_name(src_key_name)
src_bucket = self.buckets[src_bucket_name]
dest_bucket = self.buckets[dest_bucket_name]
multipart = dest_bucket.multiparts[multipart_id]
return multipart.set_part(part_id, src_bucket.keys[src_key_name].value)
def prefix_query(self, bucket, prefix, delimiter):
key_results = set()
folder_results = set()

View File

@ -160,13 +160,23 @@ class ResponseObject(object):
else:
return 404, headers, ""
if method == 'PUT':
if 'uploadId' in query and 'partNumber' in query and body:
if 'uploadId' in query and 'partNumber' in query:
upload_id = query['uploadId'][0]
part_number = int(query['partNumber'][0])
key = self.backend.set_part(bucket_name, upload_id, part_number, body)
template = Template(S3_MULTIPART_UPLOAD_RESPONSE)
if 'x-amz-copy-source' in request.headers:
src = request.headers.get("x-amz-copy-source")
src_bucket, src_key = src.split("/", 1)
key = self.backend.copy_part(
bucket_name, upload_id, part_number, src_bucket,
src_key)
template = Template(S3_MULTIPART_UPLOAD_RESPONSE)
response = template.render(part=key)
else:
key = self.backend.set_part(
bucket_name, upload_id, part_number, body)
response = ""
headers.update(key.response_dict)
return 200, headers, template.render(part=key)
return 200, headers, response
if 'x-amz-copy-source' in request.headers:
# Copy key