Merged revisions 49983 via svnmerge from
authorOlle Johansson <oej@edvina.net>
Mon, 8 Jan 2007 13:34:56 +0000 (13:34 +0000)
committerOlle Johansson <oej@edvina.net>
Mon, 8 Jan 2007 13:34:56 +0000 (13:34 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r49983 | oej | 2007-01-08 14:28:18 +0100 (Mon, 08 Jan 2007) | 3 lines

Issue #8524, support multiple via header values (tardieu)
Thanks!

........

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

channels/chan_sip.c

index f6228ae..35a239d 100644 (file)
@@ -5430,21 +5430,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, ';');
@@ -5455,13 +5459,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 */
@@ -8897,6 +8903,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 */