Files
asterisk/res/ari/resource_events.c
George Joseph 64aeb20724 ARI: REST over Websocket
This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.

For full details on how to use the new capability, visit...

https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/

Changes:

* Added utilities to http.c:
  * ast_get_http_method_from_string().
  * ast_http_parse_post_form().
* Added utilities to json.c:
  * ast_json_nvp_array_to_ast_variables().
  * ast_variables_to_json_nvp_array().
* Added definitions for new events to carry REST responses.
* Created res/ari/ari_websocket_requests.c to house the new request handlers.
* Moved non-event specific code out of res/ari/resource_events.c into
  res/ari/ari_websockets.c
* Refactored res/res_ari.c to move non-http code out of ast_ari_callback()
  (which is http specific) and into ast_ari_invoke() so it can be shared
  between both the http and websocket transports.

UpgradeNote: This commit adds the ability to make ARI REST requests over the same
websocket used to receive events.
See https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-REST-over-WebSocket/

(cherry picked from commit 6bc055416b)
2025-05-01 12:41:16 +00:00

90 lines
2.3 KiB
C

/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2012 - 2013, Digium, Inc.
*
* David M. Lee, II <dlee@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
*
* \brief /api-docs/events.{format} implementation- WebSocket resource
*
* \author David M. Lee, II <dlee@digium.com>
*/
/*** MODULEINFO
<support_level>core</support_level>
***/
#include "asterisk.h"
#include "resource_events.h"
#include "internal.h"
#include "asterisk/stasis_app.h"
void ast_ari_events_user_event(struct ast_variable *headers,
struct ast_ari_events_user_event_args *args,
struct ast_ari_response *response)
{
enum stasis_app_user_event_res res;
struct ast_json *json_variables = NULL;
if (args->variables) {
ast_ari_events_user_event_parse_body(args->variables, args);
json_variables = ast_json_object_get(args->variables, "variables");
}
if (ast_strlen_zero(args->application)) {
ast_ari_response_error(response, 400, "Bad Request",
"Missing parameter application");
return;
}
res = stasis_app_user_event(args->application,
args->event_name,
args->source, args->source_count,
json_variables);
switch (res) {
case STASIS_APP_USER_OK:
ast_ari_response_no_content(response);
break;
case STASIS_APP_USER_APP_NOT_FOUND:
ast_ari_response_error(response, 404, "Not Found",
"Application not found");
break;
case STASIS_APP_USER_EVENT_SOURCE_NOT_FOUND:
ast_ari_response_error(response, 422, "Unprocessable Entity",
"Event source was not found");
break;
case STASIS_APP_USER_EVENT_SOURCE_BAD_SCHEME:
ast_ari_response_error(response, 400, "Bad Request",
"Invalid event source URI scheme");
break;
case STASIS_APP_USER_USEREVENT_INVALID:
ast_ari_response_error(response, 400, "Bad Request",
"Invalid userevent data");
break;
case STASIS_APP_USER_INTERNAL_ERROR:
default:
ast_ari_response_error(response, 500, "Internal Server Error",
"Error processing request");
}
}