mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	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/
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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");
 | |
| 	}
 | |
| }
 |