in source/s3_meta_request.c [816:899]
void aws_s3_meta_request_send_request_finish_default(
struct aws_s3_connection *connection,
struct aws_http_stream *stream,
int error_code) {
AWS_PRECONDITION(connection);
struct aws_s3_request *request = connection->request;
AWS_PRECONDITION(request);
struct aws_s3_meta_request *meta_request = request->meta_request;
AWS_PRECONDITION(meta_request);
struct aws_s3_client *client = meta_request->client;
AWS_PRECONDITION(client);
int response_status = request->send_data.response_status;
/* If our error code is currently success, then we have some other calls to make that could still indicate a
* failure. */
if (error_code == AWS_ERROR_SUCCESS) {
/* Check if the response code indicates an error occurred. */
error_code = s_s3_meta_request_error_code_from_response_status(response_status);
if (error_code != AWS_ERROR_SUCCESS) {
aws_raise_error(error_code);
}
}
AWS_LOGF_DEBUG(
AWS_LS_S3_META_REQUEST,
"id=%p: Request %p finished with error code %d and response status %d",
(void *)meta_request,
(void *)request,
error_code,
response_status);
enum aws_s3_connection_finish_code finish_code = AWS_S3_CONNECTION_FINISH_CODE_FAILED;
if (error_code == AWS_ERROR_SUCCESS) {
finish_code = AWS_S3_CONNECTION_FINISH_CODE_SUCCESS;
} else {
aws_s3_meta_request_lock_synced_data(meta_request);
bool meta_request_finishing = aws_s3_meta_request_has_finish_result_synced(meta_request);
aws_s3_meta_request_unlock_synced_data(meta_request);
/* If the request failed due to an invalid (ie: unrecoverable) response status, or the meta request already has
* a result, then make sure that this request isn't retried. */
if (error_code == AWS_ERROR_S3_INVALID_RESPONSE_STATUS || meta_request_finishing) {
finish_code = AWS_S3_CONNECTION_FINISH_CODE_FAILED;
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p Meta request cannot recover from error %d (%s). (request=%p, response status=%d)",
(void *)meta_request,
error_code,
aws_error_str(error_code),
(void *)request,
response_status);
} else {
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p Meta request failed from error %d (%s). (request=%p, response status=%d). Try to setup a retry.",
(void *)meta_request,
error_code,
aws_error_str(error_code),
(void *)request,
response_status);
/* Otherwise, set this up for a retry if the meta request is active. */
finish_code = AWS_S3_CONNECTION_FINISH_CODE_RETRY;
}
}
if (stream != NULL) {
aws_http_stream_release(stream);
stream = NULL;
}
aws_s3_client_notify_connection_finished(client, connection, error_code, finish_code);
}