summaryrefslogtreecommitdiff
path: root/res/res_ari_channels.c
diff options
context:
space:
mode:
Diffstat (limited to 'res/res_ari_channels.c')
-rw-r--r--res/res_ari_channels.c142
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(