/*! * \brief Explicitly shutdown a session. * * \details An explicit shutdown is necessary, since the \ref stasis_app has a reference * to this session. We also need to be sure to null out the \c ws_session field, * since the websocket is about to go away. * * \internal * * \param session Event session object (\ref event_session). */ static void event_session_shutdown(struct event_session *session) { struct ao2_iterator i; char *app; int j; SCOPED_AO2LOCK(lock, session); /* Clean up the websocket_apps container */ if (session->websocket_apps) { i = ao2_iterator_init(session->websocket_apps, 0); while ((app = ao2_iterator_next(&i))) { stasis_app_unregister(app); ao2_cleanup(app); } ao2_iterator_destroy(&i); ao2_cleanup(session->websocket_apps); session->websocket_apps = NULL; } /* Clean up the message_queue container */ for (j = 0; j < AST_VECTOR_SIZE(&session->message_queue); j++) { struct ast_json *msg = AST_VECTOR_GET(&session->message_queue, j); ast_json_unref(msg); } AST_VECTOR_FREE(&session->message_queue); /* Remove the handle to the underlying websocket session */ session->ws_session = NULL; }
/*! * \brief Explicitly shutdown a session. * * An explicit shutdown is necessary, since stasis-app has a reference to this * session. We also need to be sure to null out the \c ws_session field, since * the websocket is about to go away. * * \param session Session info struct. */ static void session_shutdown(struct event_session *session) { struct ao2_iterator i; char *app; SCOPED_AO2LOCK(lock, session); i = ao2_iterator_init(session->websocket_apps, 0); while ((app = ao2_iterator_next(&i))) { stasis_app_unregister(app); ao2_cleanup(app); } ao2_iterator_destroy(&i); ao2_cleanup(session->websocket_apps); session->websocket_apps = NULL; session->ws_session = NULL; }
int ast_ari_websocket_events_event_websocket_attempted(struct ast_tcptls_session_instance *ser, struct ast_variable *headers, struct ast_ari_events_event_websocket_args *args) { int res = 0; size_t i, j; int (* register_handler)(const char *, stasis_app_cb handler, void *data); ast_debug(3, "/events WebSocket attempted\n"); if (args->app_count == 0) { ast_http_error(ser, 400, "Bad Request", "Missing param 'app'"); return -1; } if (args->subscribe_all) { register_handler = &stasis_app_register_all; } else { register_handler = &stasis_app_register; } for (i = 0; i < args->app_count; ++i) { if (ast_strlen_zero(args->app[i])) { res = -1; break; } res |= register_handler(args->app[i], app_handler, NULL); } if (res) { for (j = 0; j < i; ++j) { stasis_app_unregister(args->app[j]); } ast_http_error(ser, 400, "Bad Request", "Invalid application provided in param 'app'."); } return res; }