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;
}