static int s_credentials_provider_delegate_get_credentials()

in source/auth_credentials.c [569:623]


static int s_credentials_provider_delegate_get_credentials(
    void *delegate_user_data,
    aws_on_get_credentials_callback_fn callback,
    void *callback_user_data) {

    struct credentials_provider_binding *binding = delegate_user_data;

    PyGILState_STATE state;
    if (aws_py_gilstate_ensure(&state)) {
        /* Python has shut down. Nothing matters anymore, but don't crash */
        return aws_raise_error(AWS_ERROR_INVALID_STATE);
    }

    struct aws_credentials *native_credentials = NULL;

    PyObject *py_result = PyObject_CallFunction(binding->py_delegate, "()");
    if (!py_result) {
        AWS_LOGF_ERROR(
            AWS_LS_AUTH_CREDENTIALS_PROVIDER,
            "(id=%p) Exception in get_credentials() delegate callback",
            (void *)binding->native);

        PyErr_WriteUnraisable(binding->py_delegate);
        goto done;
    }

    /* Expect py_result to be AwsCredentials (which wraps native aws_credentials). */
    native_credentials = aws_py_get_credentials(py_result);
    if (!native_credentials) {
        AWS_LOGF_ERROR(
            AWS_LS_AUTH_CREDENTIALS_PROVIDER,
            "(id=%p) get_credentials() delegate callback failed to return AwsCredentials",
            (void *)binding->native);

        PyErr_WriteUnraisable(binding->py_delegate);
        goto done;
    }

    /* Keep native aws_credentials alive until we pass them to callback. */
    aws_credentials_acquire(native_credentials);

done:
    /* Decref the python AwsCredentials (or whatever else was returned) before releasing the GIL */
    Py_XDECREF(py_result);

    PyGILState_Release(state);

    if (!native_credentials) {
        return aws_raise_error(AWS_ERROR_CRT_CALLBACK_EXCEPTION);
    }

    callback(native_credentials, AWS_ERROR_SUCCESS, callback_user_data);
    aws_credentials_release(native_credentials);
    return AWS_OP_SUCCESS;
}