res_pjsip_rfc3326.c: Account for more than one 'Reason' header

ASTERISK-27741

Change-Id: I0aa59a54735c6d20b95c54db1bd095dbf93e7adf
pull/10/head
Ross Beer 7 years ago committed by Richard Mudgett
parent 0a96cd082b
commit 92158b7f37

@ -35,32 +35,35 @@
static void rfc3326_use_reason_header(struct ast_sip_session *session, struct pjsip_rx_data *rdata) static void rfc3326_use_reason_header(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
{ {
const pj_str_t str_reason = { "Reason", 6 }; static const pj_str_t str_reason = { "Reason", 6 };
pjsip_generic_string_hdr *header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, NULL); pjsip_generic_string_hdr *header;
char buf[20], *cause, *text; char buf[20];
char *cause;
char *text;
int code; int code;
if (!header) { header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, NULL);
return; for (; header;
} header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, header->next)) {
ast_copy_pj_str(buf, &header->hvalue, sizeof(buf));
cause = ast_skip_blanks(buf);
ast_copy_pj_str(buf, &header->hvalue, sizeof(buf)); if (strncasecmp(cause, "Q.850", 5) || !(cause = strstr(cause, "cause="))) {
cause = ast_skip_blanks(buf); continue;
}
if (strncasecmp(cause, "Q.850", 5) || !(cause = strstr(cause, "cause="))) { /* If text is present get rid of it */
return; if ((text = strstr(cause, ";"))) {
} *text = '\0';
}
/* If text is present get rid of it */ if (sscanf(cause, "cause=%30d", &code) != 1) {
if ((text = strstr(cause, ";"))) { continue;
*text = '\0'; }
}
if (sscanf(cause, "cause=%30d", &code) != 1) { ast_channel_hangupcause_set(session->channel, code & 0x7f);
return; break;
} }
ast_channel_hangupcause_set(session->channel, code & 0x7f);
} }
static int rfc3326_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata) static int rfc3326_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata)

Loading…
Cancel
Save