]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Issue #8524, support multiple via header values (tardieu)
authorOlle Johansson <oej@edvina.net>
Mon, 8 Jan 2007 13:28:18 +0000 (13:28 +0000)
committerOlle Johansson <oej@edvina.net>
Mon, 8 Jan 2007 13:28:18 +0000 (13:28 +0000)
Thanks!

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@49983 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 8c688a22b09ffe6d09b1a6655034bbf6589a938f..25a000e4bfbd0ec66c4a9d476d9f6640bc7fa137 100644 (file)
@@ -5327,21 +5327,25 @@ static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, const st
                        break;
 
                if (!copied) {  /* Only check for empty rport in topmost via header */
-                       char *rport;
+                       char leftmost[256], *others, *rport;
+
+                       /* Only work on leftmost value */
+                       ast_copy_string(leftmost, oh, sizeof(leftmost));
+                       others = strchr(leftmost, ',');
+                       if (others)
+                           *others++ = '\0';
 
                        /* Find ;rport;  (empty request) */
-                       rport = strstr(oh, ";rport");
+                       rport = strstr(leftmost, ";rport");
                        if (rport && *(rport+6) == '=') 
                                rport = NULL;           /* We already have a parameter to rport */
 
                        /* Check rport if NAT=yes or NAT=rfc3581 (which is the default setting)  */
                        if (rport && ((ast_test_flag(&p->flags[0], SIP_NAT) == SIP_NAT_ALWAYS) || (ast_test_flag(&p->flags[0], SIP_NAT) == SIP_NAT_RFC3581))) {
                                /* We need to add received port - rport */
-                               char tmp[256], *end;
-
-                               ast_copy_string(tmp, oh, sizeof(tmp));
+                               char *end;
 
-                               rport = strstr(tmp, ";rport");
+                               rport = strstr(leftmost, ";rport");
 
                                if (rport) {
                                        end = strchr(rport + 1, ';');
@@ -5352,13 +5356,15 @@ static int copy_via_headers(struct sip_pvt *p, struct sip_request *req, const st
                                }
 
                                /* Add rport to first VIA header if requested */
-                               snprintf(new, sizeof(new), "%s;received=%s;rport=%d",
-                                       tmp, ast_inet_ntoa(p->recv.sin_addr),
-                                       ntohs(p->recv.sin_port));
+                               snprintf(new, sizeof(new), "%s;received=%s;rport=%d%s%s",
+                                       leftmost, ast_inet_ntoa(p->recv.sin_addr),
+                                       ntohs(p->recv.sin_port),
+                                       others ? "," : "", others ? others : "");
                        } else {
                                /* We should *always* add a received to the topmost via */
-                               snprintf(new, sizeof(new), "%s;received=%s",
-                                       oh, ast_inet_ntoa(p->recv.sin_addr));
+                               snprintf(new, sizeof(new), "%s;received=%s%s%s",
+                                       leftmost, ast_inet_ntoa(p->recv.sin_addr),
+                                       others ? "," : "", others ? others : "");
                        }
                        oh = new;       /* the header to copy */
                }  /* else add the following via headers untouched */
@@ -8741,6 +8747,11 @@ static void check_via(struct sip_pvt *p, struct sip_request *req)
 
        ast_copy_string(via, get_header(req, "Via"), sizeof(via));
 
+       /* Work on the leftmost value of the topmost Via header */
+       c = strchr(via, ',');
+       if (c)
+               *c = '\0';
+
        /* Check for rport */
        c = strstr(via, ";rport");
        if (c && (c[6] != '=')) /* rport query, not answer */