in source/s3_auto_ranged_put.c [300:427]
static int s_s3_auto_ranged_put_prepare_request(
struct aws_s3_meta_request *meta_request,
struct aws_s3_request *request) {
AWS_PRECONDITION(meta_request);
struct aws_s3_auto_ranged_put *auto_ranged_put = meta_request->impl;
AWS_PRECONDITION(auto_ranged_put);
struct aws_http_message *message = NULL;
switch (request->request_tag) {
case AWS_S3_AUTO_RANGED_PUT_REQUEST_TAG_CREATE_MULTIPART_UPLOAD: {
/* Create the message to create a new multipart upload. */
message = aws_s3_create_multipart_upload_message_new(
meta_request->allocator, meta_request->initial_request_message);
break;
}
case AWS_S3_AUTO_RANGED_PUT_REQUEST_TAG_PART: {
size_t request_body_size = meta_request->part_size;
/* Last part--adjust size to match remaining content length. */
if (request->part_number == auto_ranged_put->synced_data.total_num_parts) {
size_t content_remainder =
(size_t)(auto_ranged_put->content_length % (uint64_t)meta_request->part_size);
if (content_remainder > 0) {
request_body_size = content_remainder;
}
}
if (request->num_times_prepared == 0) {
aws_byte_buf_init(&request->request_body, meta_request->allocator, request_body_size);
if (aws_s3_meta_request_read_body(meta_request, &request->request_body)) {
goto message_create_failed;
}
}
/* Create a new put-object message to upload a part. */
message = aws_s3_upload_part_message_new(
meta_request->allocator,
meta_request->initial_request_message,
&request->request_body,
request->part_number,
auto_ranged_put->upload_id,
meta_request->should_compute_content_md5);
break;
}
case AWS_S3_AUTO_RANGED_PUT_REQUEST_TAG_COMPLETE_MULTIPART_UPLOAD: {
if (request->num_times_prepared == 0) {
aws_byte_buf_init(
&request->request_body, meta_request->allocator, s_complete_multipart_upload_init_body_size_bytes);
} else {
aws_byte_buf_reset(&request->request_body, false);
}
aws_s3_meta_request_lock_synced_data(meta_request);
AWS_FATAL_ASSERT(auto_ranged_put->upload_id);
AWS_ASSERT(request->request_body.capacity > 0);
aws_byte_buf_reset(&request->request_body, false);
/* Build the message to complete our multipart upload, which includes a payload describing all of our
* completed parts. */
message = aws_s3_complete_multipart_message_new(
meta_request->allocator,
meta_request->initial_request_message,
&request->request_body,
auto_ranged_put->upload_id,
&auto_ranged_put->synced_data.etag_list);
aws_s3_meta_request_unlock_synced_data(meta_request);
break;
}
case AWS_S3_AUTO_RANGED_PUT_REQUEST_TAG_ABORT_MULTIPART_UPLOAD: {
AWS_FATAL_ASSERT(auto_ranged_put->upload_id);
AWS_LOGF_DEBUG(
AWS_LS_S3_META_REQUEST,
"id=%p Abort multipart upload request for upload id %s.",
(void *)meta_request,
aws_string_c_str(auto_ranged_put->upload_id));
if (request->num_times_prepared == 0) {
aws_byte_buf_init(
&request->request_body, meta_request->allocator, s_abort_multipart_upload_init_body_size_bytes);
} else {
aws_byte_buf_reset(&request->request_body, false);
}
/* Build the message to abort our multipart upload */
message = aws_s3_abort_multipart_upload_message_new(
meta_request->allocator, meta_request->initial_request_message, auto_ranged_put->upload_id);
break;
}
}
if (message == NULL) {
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p Could not allocate message for request with tag %d for auto-ranged-put meta request.",
(void *)meta_request,
request->request_tag);
goto message_create_failed;
}
aws_s3_request_setup_send_data(request, message);
aws_http_message_release(message);
AWS_LOGF_DEBUG(
AWS_LS_S3_META_REQUEST,
"id=%p: Prepared request %p for part %d",
(void *)meta_request,
(void *)request,
request->part_number);
return AWS_OP_SUCCESS;
message_create_failed:
return AWS_OP_ERR;
}