code: def _complete_multipart_upload(self, bucket_name, object_name,
                                     upload_id, uploaded_parts):
          
          is_valid_bucket_name(bucket_name)
          is_non_empty_string(object_name)
          is_non_empty_string(upload_id)
  
          # Order uploaded parts as required by S3 specification
          ordered_parts = []
          for part in sorted(uploaded_parts.keys()):
              ordered_parts.append(uploaded_parts[part])
  
          data = xml_marshal_complete_multipart_upload(ordered_parts)
          sha256_hex = get_sha256_hexdigest(data)
          md5_base64 = get_md5_base64digest(data)
  
          headers = {
              'Content-Length': len(data),
              'Content-Type': 'application/xml',
              'Content-Md5': md5_base64,
          }
  
          response = self._url_open('POST', bucket_name=bucket_name,
                                    object_name=object_name,
                                    query={'uploadId': upload_id},
                                    headers=headers, body=data,
                                    content_sha256=sha256_hex)
  
          return parse_multipart_upload_result(response.data)
docs: Complete an active multipart upload request.
  
          :param bucket_name: Bucket name of the multipart request.
          :param object_name: Object name of the multipart request.
          :param upload_id: Upload id of the active multipart request.
          :param uploaded_parts: Key, Value dictionary of uploaded parts.