[sr-dev] faster sdp_content() test

Juha Heinanen jh at tutpro.com
Thu Nov 12 14:21:22 CET 2015


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



More information about the sr-dev mailing list