[Asterisk-code-review] res pjsip refer: Prevent sending duplicate headers. (asterisk[master])
Mark Michelson
asteriskteam at digium.com
Fri Jun 26 11:02:10 CDT 2015
Mark Michelson has uploaded a new change for review.
https://gerrit.asterisk.org/729
Change subject: res_pjsip_refer: Prevent sending duplicate headers.
......................................................................
res_pjsip_refer: Prevent sending duplicate headers.
res_pjsip_refer will attempt to add Referred-By or Replaces headers to
outbound INVITEs at times. If the INVITE gets challenged for
authentication, then we will resend the INVITE. Prior to this patch, the
Referred-By or Replaces header would be re-added to the outbound INVITE,
resulting in duplicated headers.
ASTERISK-25204 #close
Reported by Mark Michelson
Change-Id: I59fb5c08b4d253c0dba9ee3d3950b5025358222d
---
M res/res_pjsip_refer.c
1 file changed, 35 insertions(+), 11 deletions(-)
git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/29/729/1
diff --git a/res/res_pjsip_refer.c b/res/res_pjsip_refer.c
index 7420e7e..657406b 100644
--- a/res/res_pjsip_refer.c
+++ b/res/res_pjsip_refer.c
@@ -1087,10 +1087,41 @@
}
}
+/*!
+ * \brief Use the value of a channel variable as the value of a SIP header
+ *
+ * This looks up a variable name on a channel, then takes that value and adds
+ * it to an outgoing SIP request. If the header already exists on the message,
+ * then no action is taken.
+ *
+ * \pre chan is locked.
+ *
+ * \param chan The channel on which to find the variable.
+ * \param var_name The name of the channel variable to use.
+ * \param header_name The name of the SIP header to add to the outgoing message.
+ * \param tdata The outgoing SIP message on which to add the header
+ */
+static void add_header_from_channel_var(struct ast_channel *chan, const char *var_name, const char *header_name, pjsip_tx_data *tdata)
+{
+ const char *var_value;
+ pj_str_t pj_header_name;
+ pjsip_hdr *header;
+
+ var_value = pbx_builtin_getvar_helper(chan, var_name);
+ if (ast_strlen_zero(var_value)) {
+ return;
+ }
+
+ pj_cstr(&pj_header_name, header_name);
+ header = pjsip_msg_find_hdr_by_name(tdata->msg, &pj_header_name, NULL);
+ if (header) {
+ return;
+ }
+ ast_sip_add_header(tdata, header_name, var_value);
+}
+
static void refer_outgoing_request(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
{
- const char *hdr;
-
if (pjsip_method_cmp(&tdata->msg->line.req.method, &pjsip_invite_method)
|| !session->channel
|| session->inv_session->state != PJSIP_INV_STATE_NULL) {
@@ -1098,15 +1129,8 @@
}
ast_channel_lock(session->channel);
- hdr = pbx_builtin_getvar_helper(session->channel, "SIPREPLACESHDR");
- if (!ast_strlen_zero(hdr)) {
- ast_sip_add_header(tdata, "Replaces", hdr);
- }
-
- hdr = pbx_builtin_getvar_helper(session->channel, "SIPREFERREDBYHDR");
- if (!ast_strlen_zero(hdr)) {
- ast_sip_add_header(tdata, "Referred-By", hdr);
- }
+ add_header_from_channel_var(session->channel, "SIPREPLACESHDR", "Replaces", tdata);
+ add_header_from_channel_var(session->channel, "SIPREFERREDBYHDR", "Referred-By", tdata);
ast_channel_unlock(session->channel);
}
--
To view, visit https://gerrit.asterisk.org/729
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I59fb5c08b4d253c0dba9ee3d3950b5025358222d
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Mark Michelson <mmichelson at digium.com>
More information about the asterisk-code-review
mailing list