in source/s3_request_messages.c [777:884]
int aws_s3_message_util_set_multipart_request_path(
struct aws_allocator *allocator,
const struct aws_string *upload_id,
uint32_t part_number,
bool append_uploads_suffix,
struct aws_http_message *message) {
const struct aws_byte_cursor question_mark = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("?");
const struct aws_byte_cursor ampersand = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("&");
const struct aws_byte_cursor uploads_suffix = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("uploads");
const struct aws_byte_cursor part_number_arg = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("partNumber=");
const struct aws_byte_cursor upload_id_arg = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("uploadId=");
struct aws_byte_buf request_path_buf;
struct aws_byte_cursor request_path;
if (aws_http_message_get_request_path(message, &request_path)) {
return AWS_OP_ERR;
}
if (aws_byte_buf_init(&request_path_buf, allocator, request_path.len)) {
return AWS_OP_ERR;
}
if (aws_byte_buf_append_dynamic(&request_path_buf, &request_path)) {
goto error_clean_up;
}
bool has_existing_query_parameters = false;
for (size_t i = 0; i < request_path.len; ++i) {
if (request_path.ptr[i] == '?') {
has_existing_query_parameters = true;
break;
}
}
if (part_number > 0) {
if (aws_byte_buf_append_dynamic(
&request_path_buf, has_existing_query_parameters ? &ersand : &question_mark)) {
goto error_clean_up;
}
if (aws_byte_buf_append_dynamic(&request_path_buf, &part_number_arg)) {
goto error_clean_up;
}
char part_number_buffer[32] = "";
snprintf(part_number_buffer, sizeof(part_number_buffer), "%d", part_number);
struct aws_byte_cursor part_number_cursor =
aws_byte_cursor_from_array(part_number_buffer, strlen(part_number_buffer));
if (aws_byte_buf_append_dynamic(&request_path_buf, &part_number_cursor)) {
goto error_clean_up;
}
has_existing_query_parameters = true;
}
if (upload_id != NULL) {
struct aws_byte_cursor upload_id_cursor = aws_byte_cursor_from_string(upload_id);
if (aws_byte_buf_append_dynamic(
&request_path_buf, has_existing_query_parameters ? &ersand : &question_mark)) {
goto error_clean_up;
}
if (aws_byte_buf_append_dynamic(&request_path_buf, &upload_id_arg)) {
goto error_clean_up;
}
if (aws_byte_buf_append_dynamic(&request_path_buf, &upload_id_cursor)) {
goto error_clean_up;
}
has_existing_query_parameters = true;
}
if (append_uploads_suffix) {
if (aws_byte_buf_append_dynamic(
&request_path_buf, has_existing_query_parameters ? &ersand : &question_mark)) {
goto error_clean_up;
}
if (aws_byte_buf_append_dynamic(&request_path_buf, &uploads_suffix)) {
goto error_clean_up;
}
has_existing_query_parameters = true;
}
struct aws_byte_cursor new_request_path = aws_byte_cursor_from_buf(&request_path_buf);
if (aws_http_message_set_request_path(message, new_request_path)) {
goto error_clean_up;
}
aws_byte_buf_clean_up(&request_path_buf);
return AWS_OP_SUCCESS;
error_clean_up:
aws_byte_buf_clean_up(&request_path_buf);
return AWS_OP_ERR;
}