Author: mjordan Date: Wed Oct 29 20:39:20 2014 New Revision: 426594 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=426594 Log: channels/chan_sip: Support mutltiple Supported and Required headers
A SIP request may contain multiple Supported: and Required: headers. Currently, chan_sip only parses the first Supported/Required header it finds. This patch adds support for multiple Supported/Required headers for INVITE requests. Review: https://reviewboard.asterisk.org/r/2478 ASTERISK-21721 #close Reported by: Olle Johansson patches: rb2478.patch uploaded by oej (License 5267) Modified: branches/1.8/channels/chan_sip.c branches/1.8/channels/sip/reqresp_parser.c Modified: branches/1.8/channels/chan_sip.c URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_sip.c?view=diff&rev=426594&r1=426593&r2=426594 ============================================================================== --- branches/1.8/channels/chan_sip.c (original) +++ branches/1.8/channels/chan_sip.c Wed Oct 29 20:39:20 2014 @@ -23134,7 +23134,9 @@ int reinvite = 0; struct ast_party_redirecting redirecting; struct ast_set_party_redirecting update_redirecting; - + int supported_start = 0; + int require_start = 0; + char unsupported[256] = { 0, }; struct { char exten[AST_MAX_EXTENSION]; char context[AST_MAX_CONTEXT]; @@ -23144,30 +23146,36 @@ /* Find out what they support */ if (!p->sipoptions) { - const char *supported = get_header(req, "Supported"); - if (!ast_strlen_zero(supported)) { - p->sipoptions = parse_sip_options(supported, NULL, 0); - } + const char *supported = NULL; + do { + supported = __get_header(req, "Supported", &supported_start); + if (!ast_strlen_zero(supported)) { + p->sipoptions |= parse_sip_options(supported, NULL, 0); + } + } while (!ast_strlen_zero(supported)); } /* Find out what they require */ - required = get_header(req, "Require"); - if (!ast_strlen_zero(required)) { - char unsupported[256] = { 0, }; - required_profile = parse_sip_options(required, unsupported, ARRAY_LEN(unsupported)); - - /* If there are any options required that we do not support, - * then send a 420 with only those unsupported options listed */ - if (!ast_strlen_zero(unsupported)) { - transmit_response_with_unsupported(p, "420 Bad extension (unsupported)", req, unsupported); - ast_log(LOG_WARNING, "Received SIP INVITE with unsupported required extension: required:%s unsupported:%s\n", required, unsupported); - p->invitestate = INV_COMPLETED; - if (!p->lastinvite) - sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); - res = -1; - goto request_invite_cleanup; - } - } + do { + required = __get_header(req, "Require", &require_start); + if (!ast_strlen_zero(required)) { + required_profile |= parse_sip_options(required, unsupported, ARRAY_LEN(unsupported)); + } + } while (!ast_strlen_zero(required)); + + /* If there are any options required that we do not support, + * then send a 420 with only those unsupported options listed */ + if (!ast_strlen_zero(unsupported)) { + transmit_response_with_unsupported(p, "420 Bad extension (unsupported)", req, unsupported); + ast_log(LOG_WARNING, "Received SIP INVITE with unsupported required extension: required:%s unsupported:%s\n", required, unsupported); + p->invitestate = INV_COMPLETED; + if (!p->lastinvite) { + sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); + } + res = -1; + goto request_invite_cleanup; + } + /* The option tags may be present in Supported: or Require: headers. Include the Require: option tags for further processing as well */ Modified: branches/1.8/channels/sip/reqresp_parser.c URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sip/reqresp_parser.c?view=diff&rev=426594&r1=426593&r2=426594 ============================================================================== --- branches/1.8/channels/sip/reqresp_parser.c (original) +++ branches/1.8/channels/sip/reqresp_parser.c Wed Oct 29 20:39:20 2014 @@ -1594,10 +1594,6 @@ char *out = unsupported; size_t outlen = unsupported_len; char *cur_out = out; - - if (out && (outlen > 0)) { - memset(out, 0, outlen); - } if (ast_strlen_zero(options) ) return 0; -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits
