static bool s_s3_meta_request_default_update()

in source/s3_default_meta_request.c [117:208]


static bool s_s3_meta_request_default_update(
    struct aws_s3_meta_request *meta_request,
    uint32_t flags,
    struct aws_s3_request **out_request) {
    (void)flags;

    AWS_PRECONDITION(meta_request);
    AWS_PRECONDITION(out_request);

    struct aws_s3_meta_request_default *meta_request_default = meta_request->impl;
    struct aws_s3_request *request = NULL;
    bool work_remaining = false;

    aws_s3_meta_request_lock_synced_data(meta_request);

    if (!aws_s3_meta_request_has_finish_result_synced(meta_request)) {

        /* If the request hasn't been sent, then create and send it now. */
        if (!meta_request_default->synced_data.request_sent) {
            if (out_request == NULL) {
                goto has_work_remaining;
            }

            request = aws_s3_request_new(meta_request, 0, 1, AWS_S3_REQUEST_FLAG_RECORD_RESPONSE_HEADERS);

            AWS_LOGF_DEBUG(
                AWS_LS_S3_META_REQUEST,
                "id=%p: Meta Request Default created request %p",
                (void *)meta_request,
                (void *)request);

            meta_request_default->synced_data.request_sent = true;
            goto has_work_remaining;
        }

        /* If the request hasn't been completed, then wait for it to be completed. */
        if (!meta_request_default->synced_data.request_completed) {
            goto has_work_remaining;
        }

        /* If delivery hasn't been attempted yet for the response body, wait for that to happen. */
        if (meta_request->synced_data.num_parts_delivery_completed < 1) {
            goto has_work_remaining;
        }

        goto no_work_remaining;

    } else {

        /* If we are canceling, and the request hasn't been sent yet, then there is nothing to wait for. */
        if (!meta_request_default->synced_data.request_sent) {
            goto no_work_remaining;
        }

        /* If the request hasn't been completed yet, then wait for that to happen. */
        if (!meta_request_default->synced_data.request_completed) {
            goto has_work_remaining;
        }

        /* If some parts are still being delievered to the caller, then wait for those to finish. */
        if (meta_request->synced_data.num_parts_delivery_completed <
            meta_request->synced_data.num_parts_delivery_sent) {
            goto has_work_remaining;
        }

        goto no_work_remaining;
    }

has_work_remaining:
    work_remaining = true;

no_work_remaining:

    if (!work_remaining) {
        aws_s3_meta_request_set_success_synced(meta_request, meta_request_default->synced_data.cached_response_status);
    }

    aws_s3_meta_request_unlock_synced_data(meta_request);

    if (work_remaining) {
        if (request != NULL) {
            AWS_ASSERT(out_request != NULL);
            *out_request = request;
        }
    } else {
        AWS_ASSERT(request == NULL);

        aws_s3_meta_request_finish(meta_request);
    }

    return work_remaining;
}