diff options
Diffstat (limited to 'res/res_ari_channels.c')
-rw-r--r-- | res/res_ari_channels.c | 142 |
1 files changed, 138 insertions, 4 deletions
diff --git a/res/res_ari_channels.c b/res/res_ari_channels.c index 1f0818170..951a5475b 100644 --- a/res/res_ari_channels.c +++ b/res/res_ari_channels.c @@ -1842,7 +1842,32 @@ int ast_ari_channels_play_parse_body( /* Parse query parameters out of it */ field = ast_json_object_get(body, "media"); if (field) { - args->media = ast_json_string_get(field); + /* If they were silly enough to both pass in a query param and a + * JSON body, free up the query value. + */ + ast_free(args->media); + if (ast_json_typeof(field) == AST_JSON_ARRAY) { + /* Multiple param passed as array */ + size_t i; + args->media_count = ast_json_array_size(field); + args->media = ast_malloc(sizeof(*args->media) * args->media_count); + + if (!args->media) { + return -1; + } + + for (i = 0; i < args->media_count; ++i) { + args->media[i] = ast_json_string_get(ast_json_array_get(field, i)); + } + } else { + /* Multiple param passed as single value */ + args->media_count = 1; + args->media = ast_malloc(sizeof(*args->media) * args->media_count); + if (!args->media) { + return -1; + } + args->media[0] = ast_json_string_get(field); + } } field = ast_json_object_get(body, "lang"); if (field) { @@ -1885,7 +1910,47 @@ static void ast_ari_channels_play_cb( for (i = get_params; i; i = i->next) { if (strcmp(i->name, "media") == 0) { - args.media = (i->value); + /* Parse comma separated list */ + char *vals[MAX_VALS]; + size_t j; + + args.media_parse = ast_strdup(i->value); + if (!args.media_parse) { + ast_ari_response_alloc_failed(response); + goto fin; + } + + if (strlen(args.media_parse) == 0) { + /* ast_app_separate_args can't handle "" */ + args.media_count = 1; + vals[0] = args.media_parse; + } else { + args.media_count = ast_app_separate_args( + args.media_parse, ',', vals, + ARRAY_LEN(vals)); + } + + if (args.media_count == 0) { + ast_ari_response_alloc_failed(response); + goto fin; + } + + if (args.media_count >= MAX_VALS) { + ast_ari_response_error(response, 400, + "Bad Request", + "Too many values for media"); + goto fin; + } + + args.media = ast_malloc(sizeof(*args.media) * args.media_count); + if (!args.media) { + ast_ari_response_alloc_failed(response); + goto fin; + } + + for (j = 0; j < args.media_count; ++j) { + args.media[j] = (vals[j]); + } } else if (strcmp(i->name, "lang") == 0) { args.lang = (i->value); @@ -1958,6 +2023,8 @@ static void ast_ari_channels_play_cb( #endif /* AST_DEVMODE */ fin: __attribute__((unused)) + ast_free(args.media_parse); + ast_free(args.media); return; } int ast_ari_channels_play_with_id_parse_body( @@ -1968,7 +2035,32 @@ int ast_ari_channels_play_with_id_parse_body( /* Parse query parameters out of it */ field = ast_json_object_get(body, "media"); if (field) { - args->media = ast_json_string_get(field); + /* If they were silly enough to both pass in a query param and a + * JSON body, free up the query value. + */ + ast_free(args->media); + if (ast_json_typeof(field) == AST_JSON_ARRAY) { + /* Multiple param passed as array */ + size_t i; + args->media_count = ast_json_array_size(field); + args->media = ast_malloc(sizeof(*args->media) * args->media_count); + + if (!args->media) { + return -1; + } + + for (i = 0; i < args->media_count; ++i) { + args->media[i] = ast_json_string_get(ast_json_array_get(field, i)); + } + } else { + /* Multiple param passed as single value */ + args->media_count = 1; + args->media = ast_malloc(sizeof(*args->media) * args->media_count); + if (!args->media) { + return -1; + } + args->media[0] = ast_json_string_get(field); + } } field = ast_json_object_get(body, "lang"); if (field) { @@ -2007,7 +2099,47 @@ static void ast_ari_channels_play_with_id_cb( for (i = get_params; i; i = i->next) { if (strcmp(i->name, "media") == 0) { - args.media = (i->value); + /* Parse comma separated list */ + char *vals[MAX_VALS]; + size_t j; + + args.media_parse = ast_strdup(i->value); + if (!args.media_parse) { + ast_ari_response_alloc_failed(response); + goto fin; + } + + if (strlen(args.media_parse) == 0) { + /* ast_app_separate_args can't handle "" */ + args.media_count = 1; + vals[0] = args.media_parse; + } else { + args.media_count = ast_app_separate_args( + args.media_parse, ',', vals, + ARRAY_LEN(vals)); + } + + if (args.media_count == 0) { + ast_ari_response_alloc_failed(response); + goto fin; + } + + if (args.media_count >= MAX_VALS) { + ast_ari_response_error(response, 400, + "Bad Request", + "Too many values for media"); + goto fin; + } + + args.media = ast_malloc(sizeof(*args.media) * args.media_count); + if (!args.media) { + ast_ari_response_alloc_failed(response); + goto fin; + } + + for (j = 0; j < args.media_count; ++j) { + args.media[j] = (vals[j]); + } } else if (strcmp(i->name, "lang") == 0) { args.lang = (i->value); @@ -2080,6 +2212,8 @@ static void ast_ari_channels_play_with_id_cb( #endif /* AST_DEVMODE */ fin: __attribute__((unused)) + ast_free(args.media_parse); + ast_free(args.media); return; } int ast_ari_channels_record_parse_body( |