aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2007-11-15 11:27:19 +0000
committeroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2007-11-15 11:27:19 +0000
commit9d192dfb8046b02063abb3f86b047aaa3bbe7ef9 (patch)
treeab7f7ec8723eda1d61821848371b33401805a596
parent9801c2468b37c0fae52169b1a3a6189e7dae31c8 (diff)
Merged revisions 89280 via svnmerge from
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: http://svn.digium.com/svn/asterisk/trunk@89282 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_sip.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 2bda45e22..e161322c3 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -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