From: Jonathan Rose Date: Tue, 10 Jun 2014 15:46:25 +0000 (+0000) Subject: PJSIP: PJSIPNotify - Strip content-length headers and add documentation X-Git-Tag: 12.4.0-rc1~65 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c2daa620aee36f32a83133db7adb2c0c426895e6;p=thirdparty%2Fasterisk.git PJSIP: PJSIPNotify - Strip content-length headers and add documentation Documentation for how to add custom headers/content to notifies created with the PJSIPNotify manager action was a little sparse and it also wasn't vetting application of Content-length headers like its chan_sip equivalent was (so two Content-length headers could be applied... and PJSIP determines the content length anyway, so it just opens people up for error). This patch also flips the variable order so that the variables are interpreted in the same order as they are put in the AMI action. Review: https://reviewboard.asterisk.org/r/3587/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@415658 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/message.c b/main/message.c index 39166e0ff6..8acfeb3d5b 100644 --- a/main/message.c +++ b/main/message.c @@ -1217,7 +1217,7 @@ static int action_messagesend(struct mansession *s, const struct message *m) return -1; } - data = astman_get_variables(m); + data = astman_get_variables_order(m, ORDER_NATURAL); for (vars = data; vars; vars = vars->next) { ast_msg_set_var_outbound(msg, vars->name, vars->value); } diff --git a/res/res_pjsip_notify.c b/res/res_pjsip_notify.c index b2f24cbf29..ab5c930bd6 100644 --- a/res/res_pjsip_notify.c +++ b/res/res_pjsip_notify.c @@ -44,10 +44,17 @@ The endpoint to which to send the NOTIFY. + + Appends variables as headers/content to the NOTIFY. If the variable is + named Content, then the value will compose the body + of the message if another variable sets Content-Type. + name=value + - Send a NOTIFY to an endpoint. - Parameters will be placed into the notify as SIP headers. + Sends a NOTIFY to an endpoint. + All parameters for this event must be specified in the body of this request + via multiple Variable: name=value sequences. @@ -452,6 +459,10 @@ static void build_ami_notify(pjsip_tx_data *tdata, void *info) struct ast_variable *i; for (i = vars; i; i = i->next) { + if (!strcasecmp(i->name, "Content-Length")) { + ast_log(LOG_NOTICE, "It is not necessary to specify Content-Length, ignoring.\n"); + continue; + } build_notify(tdata, i->name, i->value, &content_type, &content); } @@ -699,10 +710,11 @@ static struct ast_cli_entry cli_options[] = { static int manager_notify(struct mansession *s, const struct message *m) { const char *endpoint_name = astman_get_header(m, "Endpoint"); - struct ast_variable *vars = astman_get_variables(m); + struct ast_variable *vars = astman_get_variables_order(m, ORDER_NATURAL); if (ast_strlen_zero(endpoint_name)) { astman_send_error(s, m, "PJSIPNotify requires an endpoint name"); + ast_variables_destroy(vars); return 0; } @@ -710,22 +722,29 @@ static int manager_notify(struct mansession *s, const struct message *m) endpoint_name += 4; } + if (!strncasecmp(endpoint_name, "pjsip/", 6)) { + endpoint_name += 6; + } + switch (push_notify(endpoint_name, vars, notify_ami_data_create)) { case INVALID_ENDPOINT: + ast_variables_destroy(vars); astman_send_error_va(s, m, "Unable to retrieve endpoint %s\n", endpoint_name); - return 0; + break; case ALLOC_ERROR: + ast_variables_destroy(vars); astman_send_error(s, m, "Unable to allocate NOTIFY task data\n"); - return 0; + break; case TASK_PUSH_ERROR: + /* Don't need to destroy vars since it is handled by cleanup in push_notify */ astman_send_error(s, m, "Unable to push NOTIFY task\n"); - return 0; - default: + break; + case SUCCESS: + astman_send_ack(s, m, "NOTIFY sent"); break; } - astman_send_ack(s, m, "NOTIFY sent"); return 0; }