Merged revisions 89280 via svnmerge from
authorOlle Johansson <oej@edvina.net>
Thu, 15 Nov 2007 11:27:19 +0000 (11:27 +0000)
committerOlle Johansson <oej@edvina.net>
Thu, 15 Nov 2007 11:27:19 +0000 (11:27 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r89280 | oej | 2007-11-15 12:15:09 +0100 (Tor, 15 Nov 2007) | 5 lines

Improve support for multipart messages. Code by gasparz, changes
by me (mostly formatting). Thanks, gasparz!

Closes issue #10947

........

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

channels/chan_sip.c

index 2bda45e..e161322 100644 (file)
@@ -5444,6 +5444,8 @@ static int find_sdp(struct sip_request *req)
        char *boundary;
        unsigned int x;
        int boundaryisquoted = FALSE;
+       int found_application_sdp = FALSE;
+       int found_end_of_headers = FALSE;
 
        content_type = get_header(req, "Content-Type");
 
@@ -5476,31 +5478,36 @@ static int find_sdp(struct sip_request *req)
           at the beginning */
        boundary = ast_strdupa(search - 2);
        boundary[0] = boundary[1] = '-';
-
        /* Remove final quote */
        if (boundaryisquoted)
                boundary[strlen(boundary) - 1] = '\0';
 
-       /* search for the boundary marker, but stop when there are not enough
-          lines left for it, the Content-Type header and at least one line of
-          body */
-       for (x = 0; x < (req->lines - 2); x++) {
-               if (!strncasecmp(req->line[x], boundary, strlen(boundary)) &&
-                   !strcasecmp(req->line[x + 1], "Content-Type: application/sdp")) {
-                       x += 2;
-                       req->sdp_start = x;
-
-                       /* search for the end of the body part */
-                       for ( ; x < req->lines; x++) {
-                               if (!strncasecmp(req->line[x], boundary, strlen(boundary)))
-                                       break;
+       /* search for the boundary marker, the empty line delimiting headers from
+          sdp part and the end boundry if it exists */
+
+       for (x = 0; x < (req->lines ); x++) {
+               if(!strncasecmp(req->line[x], boundary, strlen(boundary))){
+                       if(found_application_sdp && found_end_of_headers){
+                               req->sdp_end = x-1;
+                               return 1;
+                       }
+                       found_application_sdp = FALSE;
+               }
+               if(!strcasecmp(req->line[x], "Content-Type: application/sdp"))
+                       found_application_sdp = TRUE;
+               
+               if(strlen(req->line[x]) == 0 ){
+                       if(found_application_sdp && !found_end_of_headers){
+                               req->sdp_start = x;
+                               found_end_of_headers = TRUE;
                        }
-                       req->sdp_end = x;
-                       return 1;
                }
        }
-
-       return 0;
+       if(found_application_sdp && found_end_of_headers) {
+               req->sdp_end = x;
+               return TRUE;
+       }
+       return FALSE;
 }
 
 /*! \brief Process SIP SDP offer, select formats and activate RTP channels