diff --git a/res/res_stasis_http_asterisk.c b/res/res_stasis_http_asterisk.c index c0ff660cdf50c3ed0495af5cd87e0cff14b390cc..3c035652d10d348dcb2cc00182db341a26d89345 100644 --- a/res/res_stasis_http_asterisk.c +++ b/res/res_stasis_http_asterisk.c @@ -106,9 +106,14 @@ static void stasis_http_get_asterisk_info_cb( * \param[out] response Response to the HTTP request. */ static void stasis_http_get_global_var_cb( - struct ast_variable *get_params, struct ast_variable *path_vars, - struct ast_variable *headers, struct stasis_http_response *response) + struct ast_variable *get_params, struct ast_variable *path_vars, + struct ast_variable *headers, struct stasis_http_response *response) { +#if defined(AST_DEVMODE) + int is_valid; + int code; +#endif /* AST_DEVMODE */ + struct ast_get_global_var_args args = {}; struct ast_variable *i; @@ -119,6 +124,29 @@ static void stasis_http_get_global_var_cb( {} } stasis_http_get_global_var(headers, &args, response); +#if defined(AST_DEVMODE) + code = response->response_code; + + switch (code) { + case 500: /* Internal server error */ + is_valid = 1; + break; + default: + if (200 <= code && code <= 299) { + is_valid = ari_validate_variable( + response->message); + } else { + ast_log(LOG_ERROR, "Invalid error response %d for /asterisk/variable\n", code); + is_valid = 0; + } + } + + if (!is_valid) { + ast_log(LOG_ERROR, "Response validation failed for /asterisk/variable\n"); + stasis_http_response_error(response, 500, + "Internal Server Error", "Response validation failed"); + } +#endif /* AST_DEVMODE */ } /*! * \brief Parameter parsing callback for /asterisk/variable. @@ -128,9 +156,14 @@ static void stasis_http_get_global_var_cb( * \param[out] response Response to the HTTP request. */ static void stasis_http_set_global_var_cb( - struct ast_variable *get_params, struct ast_variable *path_vars, - struct ast_variable *headers, struct stasis_http_response *response) + struct ast_variable *get_params, struct ast_variable *path_vars, + struct ast_variable *headers, struct stasis_http_response *response) { +#if defined(AST_DEVMODE) + int is_valid; + int code; +#endif /* AST_DEVMODE */ + struct ast_set_global_var_args args = {}; struct ast_variable *i; @@ -144,6 +177,29 @@ static void stasis_http_set_global_var_cb( {} } stasis_http_set_global_var(headers, &args, response); +#if defined(AST_DEVMODE) + code = response->response_code; + + switch (code) { + case 500: /* Internal server error */ + is_valid = 1; + break; + default: + if (200 <= code && code <= 299) { + is_valid = ari_validate_void( + response->message); + } else { + ast_log(LOG_ERROR, "Invalid error response %d for /asterisk/variable\n", code); + is_valid = 0; + } + } + + if (!is_valid) { + ast_log(LOG_ERROR, "Response validation failed for /asterisk/variable\n"); + stasis_http_response_error(response, 500, + "Internal Server Error", "Response validation failed"); + } +#endif /* AST_DEVMODE */ } /*! \brief REST handler for /api-docs/asterisk.{format} */ diff --git a/res/res_stasis_http_channels.c b/res/res_stasis_http_channels.c index a3d2932a27632c46fb722ac55b3bd6adf7f4abed..5c150dffb9e5943c5519c024371ab3a408341f51 100644 --- a/res/res_stasis_http_channels.c +++ b/res/res_stasis_http_channels.c @@ -818,9 +818,14 @@ static void stasis_http_record_channel_cb( * \param[out] response Response to the HTTP request. */ static void stasis_http_get_channel_var_cb( - struct ast_variable *get_params, struct ast_variable *path_vars, - struct ast_variable *headers, struct stasis_http_response *response) + struct ast_variable *get_params, struct ast_variable *path_vars, + struct ast_variable *headers, struct stasis_http_response *response) { +#if defined(AST_DEVMODE) + int is_valid; + int code; +#endif /* AST_DEVMODE */ + struct ast_get_channel_var_args args = {}; struct ast_variable *i; @@ -837,6 +842,31 @@ static void stasis_http_get_channel_var_cb( {} } stasis_http_get_channel_var(headers, &args, response); +#if defined(AST_DEVMODE) + code = response->response_code; + + switch (code) { + case 500: /* Internal server error */ + case 404: /* Channel not found */ + case 409: /* Channel not in a Stasis application */ + is_valid = 1; + break; + default: + if (200 <= code && code <= 299) { + is_valid = ari_validate_variable( + response->message); + } else { + ast_log(LOG_ERROR, "Invalid error response %d for /channels/{channelId}/variable\n", code); + is_valid = 0; + } + } + + if (!is_valid) { + ast_log(LOG_ERROR, "Response validation failed for /channels/{channelId}/variable\n"); + stasis_http_response_error(response, 500, + "Internal Server Error", "Response validation failed"); + } +#endif /* AST_DEVMODE */ } /*! * \brief Parameter parsing callback for /channels/{channelId}/variable. @@ -846,9 +876,14 @@ static void stasis_http_get_channel_var_cb( * \param[out] response Response to the HTTP request. */ static void stasis_http_set_channel_var_cb( - struct ast_variable *get_params, struct ast_variable *path_vars, - struct ast_variable *headers, struct stasis_http_response *response) + struct ast_variable *get_params, struct ast_variable *path_vars, + struct ast_variable *headers, struct stasis_http_response *response) { +#if defined(AST_DEVMODE) + int is_valid; + int code; +#endif /* AST_DEVMODE */ + struct ast_set_channel_var_args args = {}; struct ast_variable *i; @@ -868,6 +903,31 @@ static void stasis_http_set_channel_var_cb( {} } stasis_http_set_channel_var(headers, &args, response); +#if defined(AST_DEVMODE) + code = response->response_code; + + switch (code) { + case 500: /* Internal server error */ + case 404: /* Channel not found */ + case 409: /* Channel not in a Stasis application */ + is_valid = 1; + break; + default: + if (200 <= code && code <= 299) { + is_valid = ari_validate_void( + response->message); + } else { + ast_log(LOG_ERROR, "Invalid error response %d for /channels/{channelId}/variable\n", code); + is_valid = 0; + } + } + + if (!is_valid) { + ast_log(LOG_ERROR, "Response validation failed for /channels/{channelId}/variable\n"); + stasis_http_response_error(response, 500, + "Internal Server Error", "Response validation failed"); + } +#endif /* AST_DEVMODE */ } /*! \brief REST handler for /api-docs/channels.{format} */ diff --git a/res/stasis_http/ari_model_validators.c b/res/stasis_http/ari_model_validators.c index 14b5d6974737ea4a943c6c0b0da451c8b7487ad4..bf3c0e7d0a6abba98d152e475d133d60d24aa0fa 100644 --- a/res/stasis_http/ari_model_validators.c +++ b/res/stasis_http/ari_model_validators.c @@ -57,6 +57,44 @@ ari_validator ari_validate_asterisk_info_fn(void) return ari_validate_asterisk_info; } +int ari_validate_variable(struct ast_json *json) +{ + int res = 1; + struct ast_json_iter *iter; + int has_value = 0; + + for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) { + if (strcmp("value", ast_json_object_iter_key(iter)) == 0) { + int prop_is_valid; + has_value = 1; + prop_is_valid = ari_validate_string( + ast_json_object_iter_value(iter)); + if (!prop_is_valid) { + ast_log(LOG_ERROR, "ARI Variable field value failed validation\n"); + res = 0; + } + } else + { + ast_log(LOG_ERROR, + "ARI Variable has undocumented field %s\n", + ast_json_object_iter_key(iter)); + res = 0; + } + } + + if (!has_value) { + ast_log(LOG_ERROR, "ARI Variable missing required field value\n"); + res = 0; + } + + return res; +} + +ari_validator ari_validate_variable_fn(void) +{ + return ari_validate_variable; +} + int ari_validate_endpoint(struct ast_json *json) { int res = 1; diff --git a/res/stasis_http/ari_model_validators.h b/res/stasis_http/ari_model_validators.h index ee3d09308ba9a194ba541d6352c9c3b6b53092a7..2f6418657ddb14f9f0fc111ba9bf2cafafcd5aa2 100644 --- a/res/stasis_http/ari_model_validators.h +++ b/res/stasis_http/ari_model_validators.h @@ -161,6 +161,24 @@ int ari_validate_asterisk_info(struct ast_json *json); */ ari_validator ari_validate_asterisk_info_fn(void); +/*! + * \brief Validator for Variable. + * + * The value of a channel variable + * + * \param json JSON object to validate. + * \returns True (non-zero) if valid. + * \returns False (zero) if invalid. + */ +int ari_validate_variable(struct ast_json *json); + +/*! + * \brief Function pointer to ari_validate_variable(). + * + * See \ref ari_model_validators.h for more details. + */ +ari_validator ari_validate_variable_fn(void); + /*! * \brief Validator for Endpoint. * @@ -767,6 +785,8 @@ ari_validator ari_validate_stasis_start_fn(void); * JSON models * * AsteriskInfo + * Variable + * - value: string (required) * Endpoint * - channel_ids: List[string] (required) * - resource: string (required) diff --git a/rest-api/api-docs/asterisk.json b/rest-api/api-docs/asterisk.json index 8c404a075e3f383e1a04dd3d9a3275b84ef77726..8bc8874857087e3e56a03138247b6264586fc9b5 100644 --- a/rest-api/api-docs/asterisk.json +++ b/rest-api/api-docs/asterisk.json @@ -92,8 +92,9 @@ }, "Variable": { "id": "Variable", + "description": "The value of a channel variable", "properties": { - "variable": { + "value": { "required": true, "type": "string", "description": "The value of the variable requested" diff --git a/rest-api/api-docs/channels.json b/rest-api/api-docs/channels.json index a97f225669d52396d6ec4baf5a5e2469713a85a0..c442d8eb3dd02b7872df90d7667aa9aa6d14dbca 100644 --- a/rest-api/api-docs/channels.json +++ b/rest-api/api-docs/channels.json @@ -654,7 +654,7 @@ "httpMethod": "GET", "summary": "Get the value of a channel variable or function.", "nickname": "getChannelVar", - "responseClass": "ChannelVariable", + "responseClass": "Variable", "parameters": [ { "name": "channelId", @@ -827,16 +827,6 @@ "description": "Timestamp when channel was created" } } - }, - "Variable": { - "id": "Variable", - "properties": { - "variable": { - "required": true, - "type": "string", - "description": "The value of the variable requested" - } - } } } }