in source/http_connection.c [103:155]
static void s_on_client_connection_setup(
struct aws_http_connection *native_connection,
int error_code,
void *user_data) {
struct http_connection_binding *connection = user_data;
AWS_FATAL_ASSERT((native_connection != NULL) ^ error_code);
AWS_FATAL_ASSERT(connection->on_setup);
connection->native = native_connection;
PyGILState_STATE state;
if (aws_py_gilstate_ensure(&state)) {
return; /* Python has shut down. Nothing matters anymore, but don't crash */
}
enum aws_http_version http_version = AWS_HTTP_VERSION_UNKNOWN;
/* If setup was successful, encapsulate binding so we can pass it to python */
PyObject *capsule = NULL;
if (!error_code) {
capsule = PyCapsule_New(connection, s_capsule_name_http_connection, s_connection_capsule_destructor);
if (!capsule) {
error_code = AWS_ERROR_UNKNOWN;
}
http_version = aws_http_connection_get_version(native_connection);
}
/* Invoke on_setup, then clear our reference to it */
PyObject *result =
PyObject_CallFunction(connection->on_setup, "(Oii)", capsule ? capsule : Py_None, error_code, http_version);
if (result) {
Py_DECREF(result);
} else {
/* Callback might fail during application shutdown */
PyErr_WriteUnraisable(PyErr_Occurred());
}
Py_CLEAR(connection->on_setup);
if (native_connection) {
/* Connection exists, but failed to create capsule. Release connection, which eventually destroys binding */
if (!capsule) {
s_connection_release(connection);
}
} else {
/* Connection failed its setup, destroy binding now */
s_connection_destroy(connection);
}
Py_XDECREF(capsule);
Py_XDECREF(result);
PyGILState_Release(state);
}