[asterisk-commits] mjordan: branch 12 r426596 - in /branches/12: ./ channels/ channels/sip/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Oct 29 20:46:59 CDT 2014
Author: mjordan
Date: Wed Oct 29 20:46:55 2014
New Revision: 426596
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=426596
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)
........
Merged revisions 426594 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 426595 from http://svn.asterisk.org/svn/asterisk/branches/11
Modified:
branches/12/ (props changed)
branches/12/channels/chan_sip.c
branches/12/channels/sip/reqresp_parser.c
Propchange: branches/12/
------------------------------------------------------------------------------
Binary property 'branch-11-merged' - no diff available.
Modified: branches/12/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/channels/chan_sip.c?view=diff&rev=426596&r1=426595&r2=426596
==============================================================================
--- branches/12/channels/chan_sip.c (original)
+++ branches/12/channels/chan_sip.c Wed Oct 29 20:46:55 2014
@@ -25332,7 +25332,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];
@@ -25344,30 +25346,36 @@
/* Find out what they support */
if (!p->sipoptions) {
- const char *supported = sip_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 = sip_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 = INV_REQ_ERROR;
- 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/12/channels/sip/reqresp_parser.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/channels/sip/reqresp_parser.c?view=diff&rev=426596&r1=426595&r2=426596
==============================================================================
--- branches/12/channels/sip/reqresp_parser.c (original)
+++ branches/12/channels/sip/reqresp_parser.c Wed Oct 29 20:46:55 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;
More information about the asterisk-commits
mailing list