@@ -1123,7 +1123,7 @@ static ERL_NIF_TERM nif_asgi_build_scope(ErlNifEnv *env, int argc, const ERL_NIF
11231123}
11241124
11251125static ERL_NIF_TERM nif_asgi_run (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv []) {
1126- if (argc < 4 ) {
1126+ if (argc < 5 ) {
11271127 return make_error (env , "badarg" );
11281128 }
11291129
@@ -1135,23 +1135,28 @@ static ERL_NIF_TERM nif_asgi_run(ErlNifEnv *env, int argc, const ERL_NIF_TERM ar
11351135 return make_error (env , "asgi_not_initialized" );
11361136 }
11371137
1138- ErlNifBinary module_bin , callable_bin ;
1138+ ErlNifBinary runner_bin , module_bin , callable_bin ;
11391139
1140- if (!enif_inspect_binary (env , argv [0 ], & module_bin )) {
1140+ if (!enif_inspect_binary (env , argv [0 ], & runner_bin )) {
1141+ return make_error (env , "invalid_runner" );
1142+ }
1143+ if (!enif_inspect_binary (env , argv [1 ], & module_bin )) {
11411144 return make_error (env , "invalid_module" );
11421145 }
1143- if (!enif_inspect_binary (env , argv [1 ], & callable_bin )) {
1146+ if (!enif_inspect_binary (env , argv [2 ], & callable_bin )) {
11441147 return make_error (env , "invalid_callable" );
11451148 }
11461149
11471150 PyGILState_STATE gstate = PyGILState_Ensure ();
11481151
11491152 ERL_NIF_TERM result ;
11501153
1151- /* Convert module and callable names */
1154+ /* Convert runner, module and callable names */
1155+ char * runner_name = binary_to_string (& runner_bin );
11521156 char * module_name = binary_to_string (& module_bin );
11531157 char * callable_name = binary_to_string (& callable_bin );
1154- if (module_name == NULL || callable_name == NULL ) {
1158+ if (runner_name == NULL || module_name == NULL || callable_name == NULL ) {
1159+ enif_free (runner_name );
11551160 enif_free (module_name );
11561161 enif_free (callable_name );
11571162 PyGILState_Release (gstate );
@@ -1174,24 +1179,24 @@ static ERL_NIF_TERM nif_asgi_run(ErlNifEnv *env, int argc, const ERL_NIF_TERM ar
11741179 }
11751180
11761181 /* Build optimized scope dict from Erlang map */
1177- PyObject * scope = asgi_scope_from_map (env , argv [2 ]);
1182+ PyObject * scope = asgi_scope_from_map (env , argv [3 ]);
11781183 if (scope == NULL ) {
11791184 Py_DECREF (asgi_app );
11801185 result = make_py_error (env );
11811186 goto cleanup ;
11821187 }
11831188
11841189 /* Convert body binary */
1185- PyObject * body = asgi_binary_to_buffer (env , argv [3 ]);
1190+ PyObject * body = asgi_binary_to_buffer (env , argv [4 ]);
11861191 if (body == NULL ) {
11871192 Py_DECREF (scope );
11881193 Py_DECREF (asgi_app );
11891194 result = make_py_error (env );
11901195 goto cleanup ;
11911196 }
11921197
1193- /* Import the ASGI runner from hornbeam */
1194- PyObject * runner_module = PyImport_ImportModule ("hornbeam_asgi_runner" );
1198+ /* Import the ASGI runner module */
1199+ PyObject * runner_module = PyImport_ImportModule (runner_name );
11951200 if (runner_module == NULL ) {
11961201 /* Fallback: try to run ASGI app directly with asyncio.run */
11971202 PyErr_Clear ();
@@ -1213,11 +1218,11 @@ static ERL_NIF_TERM nif_asgi_run(ErlNifEnv *env, int argc, const ERL_NIF_TERM ar
12131218 Py_DECREF (body );
12141219 Py_DECREF (scope );
12151220 Py_DECREF (asgi_app );
1216- result = make_error (env , "hornbeam_asgi_runner_required " );
1221+ result = make_error (env , "runner_module_required " );
12171222 goto cleanup ;
12181223 }
12191224
1220- /* Call run_asgi (module_name, callable_name, scope, body) */
1225+ /* Call _run_asgi_sync (module_name, callable_name, scope, body) */
12211226 PyObject * run_result = PyObject_CallMethod (
12221227 runner_module , "_run_asgi_sync" , "ssOO" ,
12231228 module_name , callable_name , scope , body );
@@ -1239,6 +1244,7 @@ static ERL_NIF_TERM nif_asgi_run(ErlNifEnv *env, int argc, const ERL_NIF_TERM ar
12391244 result = enif_make_tuple2 (env , ATOM_OK , term_result );
12401245
12411246cleanup :
1247+ enif_free (runner_name );
12421248 enif_free (module_name );
12431249 enif_free (callable_name );
12441250 PyGILState_Release (gstate );
0 commit comments