summaryrefslogtreecommitdiff
path: root/res/ari
diff options
context:
space:
mode:
authorDavid M. Lee <dlee@digium.com>2013-08-23 17:19:02 +0000
committerDavid M. Lee <dlee@digium.com>2013-08-23 17:19:02 +0000
commit7a581537e8baaff143254415d782a492dec97a62 (patch)
treebe5296efe1ee7f85581b3e0c69c8ad6be252eb00 /res/ari
parent9f4849724fce1a780771e11bd5273eac2b4f61b8 (diff)
ARI: Correct error codes for bridge operations
This patch adds error checking to ARI bridge operations, when adding/removing channels to/from bridges. In general, the error codes fall out as follows: * Bridge not found - 404 Not Found * Bridge not in Stasis - 409 Conflict * Channel not found - 400 Bad Request * Channel not in Stasis - 422 Unprocessable Entity * Channel not in this bridge (on remove) - 422 Unprocessable Entity (closes issue ASTERISK-22036) Review: https://reviewboard.asterisk.org/r/2769/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@397565 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/ari')
-rw-r--r--res/ari/resource_bridges.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/res/ari/resource_bridges.c b/res/ari/resource_bridges.c
index 670792fc1..ef7767f71 100644
--- a/res/ari/resource_bridges.c
+++ b/res/ari/resource_bridges.c
@@ -99,6 +99,18 @@ static struct stasis_app_control *find_channel_control(
control = stasis_app_control_find_by_channel_id(channel_id);
if (control == NULL) {
+ /* Distinguish between 400 and 422 errors */
+ RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL,
+ ao2_cleanup);
+ snapshot = ast_channel_snapshot_get_latest(channel_id);
+ if (snapshot == NULL) {
+ ast_log(LOG_DEBUG, "Couldn't find '%s'\n", channel_id);
+ ast_ari_response_error(response, 400, "Bad Request",
+ "Channel not found");
+ return NULL;
+ }
+
+ ast_log(LOG_DEBUG, "Found non-stasis '%s'\n", channel_id);
ast_ari_response_error(response, 422, "Unprocessable Entity",
"Channel not in Stasis application");
return NULL;
@@ -145,6 +157,7 @@ static struct control_list *control_list_create(struct ast_ari_response *respons
list->controls[list->count] =
find_channel_control(response, channels[i]);
if (!list->controls[list->count]) {
+ /* response filled in by find_channel_control() */
return NULL;
}
++list->count;
@@ -166,7 +179,7 @@ void ast_ari_add_channel_to_bridge(struct ast_variable *headers, struct ast_add_
size_t i;
if (!bridge) {
- /* Response filled in by find_bridge */
+ /* Response filled in by find_bridge() */
return;
}
@@ -200,7 +213,7 @@ void ast_ari_remove_channel_from_bridge(struct ast_variable *headers, struct ast
size_t i;
if (!bridge) {
- /* Response filled in by find_bridge */
+ /* Response filled in by find_bridge() */
return;
}
@@ -210,17 +223,22 @@ void ast_ari_remove_channel_from_bridge(struct ast_variable *headers, struct ast
return;
}
- /* BUGBUG this should make sure the bridge requested for removal is actually
- * the bridge the channel is in. This will be possible once the bridge uniqueid
- * is added to the channel snapshot. A 409 response should be issued if the bridge
- * uniqueids don't match */
+ /* Make sure all of the channels are in this bridge */
for (i = 0; i < list->count; ++i) {
- stasis_app_control_remove_channel_from_bridge(list->controls[i],
- bridge);
+ if (stasis_app_get_bridge(list->controls[i]) != bridge) {
+ ast_log(LOG_WARNING, "Channel %s not in bridge %s\n",
+ args->channel[i], args->bridge_id);
+ ast_ari_response_error(response, 422,
+ "Unprocessable Entity",
+ "Channel not in this bridge");
+ return;
+ }
}
- if (response->response_code) {
- return;
+ /* Now actually remove it */
+ for (i = 0; i < list->count; ++i) {
+ stasis_app_control_remove_channel_from_bridge(list->controls[i],
+ bridge);
}
ast_ari_response_no_content(response);