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;
}
}