i wrote new version of sdp_content() test that does not parse the whole sdp like the current one does. instead it checks if request has a body and content type is either missing or it is application/sdp or content type is multipart/mixed and boxy has string application/sdp.
could this one replace the current one or do i need to invent a new name for it?
the implementation also includes new general purpose function strnistr, equivalent of which i did not find in kamailio source.
-- juha
------------------------------------------------------------------
/* * Find the first case insensitive occurrence of find in s, where the * search is limited to the first slen characters of s. Idea stolen from * FreeBSD. */ char* strnistr(const char *s, const char *find, size_t slen) { char c, sc; size_t len;
if ((c = *find++) != '\0') { len = strlen(find); do { do { if ((sc = *s++) == '\0' || slen-- < 1) return (NULL); } while (sc != c); if (len > slen) return (NULL); } while (strncasecmp(s, find, len) != 0); s--; } return ((char *)s); }
/** * */ static int w_sdp_content(sip_msg_t* msg, char* foo, char *bar) { str body; int mime;
body.s = get_body(msg); if (body.s == NULL) return -1; body.len = msg->len - (int)(body.s - msg->buf); if (body.len == 0) return -1;
mime = parse_content_type_hdr(msg); if (mime < 0) return -1; /* error */ if (mime == 0) return 1; /* default is application/sdp */
switch (((unsigned int)mime) >> 16) { case TYPE_APPLICATION: if ((mime & 0x00ff) == SUBTYPE_SDP) return 1; else return -1; case TYPE_MULTIPART: if ((mime & 0x00ff) == SUBTYPE_MIXED) { if (strnistr(body.s, "application/sdp", body.len) == NULL) { return -1; } else { return 1; } } else { return -1; } default: return -1; } }