[sr-dev] git:master:42228552: core: helper functions to search variants of str in another str

Daniel-Constantin Mierla miconda at gmail.com
Thu Sep 3 13:46:02 CEST 2020


Module: kamailio
Branch: master
Commit: 42228552b72267786561704f120e3da3aac5fd89
URL: https://github.com/kamailio/kamailio/commit/42228552b72267786561704f120e3da3aac5fd89

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2020-09-03T12:47:50+02:00

core: helper functions to search variants of str in another str

---

Modified: src/core/tcp_read.c
Modified: src/core/ut.c
Modified: src/core/ut.h

---

Diff:  https://github.com/kamailio/kamailio/commit/42228552b72267786561704f120e3da3aac5fd89.diff
Patch: https://github.com/kamailio/kamailio/commit/42228552b72267786561704f120e3da3aac5fd89.patch

---

diff --git a/src/core/tcp_read.c b/src/core/tcp_read.c
index 655db7da7b..6a005a9a32 100644
--- a/src/core/tcp_read.c
+++ b/src/core/tcp_read.c
@@ -110,26 +110,6 @@ int tcp_set_clone_rcvbuf(int v)
 }
 
 #ifdef READ_HTTP11
-static inline char *strfindcasestrz(str *haystack, char *needlez)
-{
-	int i,j;
-	str needle;
-
-	needle.s = needlez;
-	needle.len = strlen(needlez);
-	for(i=0;i<haystack->len-needle.len;i++) {
-		for(j=0;j<needle.len;j++) {
-			if ( !((haystack->s[i+j]==needle.s[j]) ||
-					( isalpha((int)haystack->s[i+j])
-						&& ((haystack->s[i+j])^(needle.s[j]))==0x20 )) )
-				break;
-		}
-		if (j==needle.len)
-			return haystack->s+i;
-	}
-	return 0;
-}
-
 int tcp_http11_continue(struct tcp_connection *c)
 {
 	struct dest_info dst;
@@ -161,7 +141,7 @@ int tcp_http11_continue(struct tcp_connection *c)
 		return 0;
 
 	/* check for Expect header */
-	if(strfindcasestrz(&msg, "Expect: 100-continue")!=NULL)
+	if(str_casesearch_strz(&msg, "Expect: 100-continue")!=NULL)
 	{
 		init_dst_from_rcv(&dst, &c->rcv);
 		if (tcp_send(&dst, 0, HTTP11CONTINUE, HTTP11CONTINUE_LEN) < 0) {
@@ -169,7 +149,7 @@ int tcp_http11_continue(struct tcp_connection *c)
 		}
 	}
 	/* check for Transfer-Encoding header */
-	if(strfindcasestrz(&msg, "Transfer-Encoding: chunked")!=NULL)
+	if(str_casesearch_strz(&msg, "Transfer-Encoding: chunked")!=NULL)
 	{
 		c->req.flags |= F_TCP_REQ_BCHUNKED;
 		ret = 1;
@@ -178,7 +158,7 @@ int tcp_http11_continue(struct tcp_connection *c)
 	 * - HTTP Via format is different that SIP Via
 	 * - workaround: replace with Hia to be ignored by SIP parser
 	 */
-	if((p=strfindcasestrz(&msg, "\nVia:"))!=NULL)
+	if((p=str_casesearch_strz(&msg, "\nVia:"))!=NULL)
 	{
 		p++;
 		*p = 'H';
diff --git a/src/core/ut.c b/src/core/ut.c
index 90b01d1026..0189b642ab 100644
--- a/src/core/ut.c
+++ b/src/core/ut.c
@@ -296,6 +296,53 @@ char *str_search(str *text, str *needle)
     return NULL;
 }
 
+/**
+ * @brief case insensitive search for occurence of needle in text
+ * @return pointer to start of needle in text or NULL if the needle
+ *	is not found
+ */
+char *str_casesearch(str *text, str *needle)
+{
+	int i,j;
+	for(i=0;i<text->len-needle->len;i++) {
+		for(j=0;j<needle->len;j++) {
+			if ( !((text->s[i+j]==needle->s[j]) ||
+					( isalpha((int)text->s[i+j])
+						&& ((text->s[i+j])^(needle->s[j]))==0x20 )) )
+				break;
+		}
+		if (j==needle->len)
+			return text->s+i;
+	}
+	return 0;
+}
+
+/**
+ * portable strcasestr() - the libc version requires #define _GNU_SOURCE
+ */
+char *strz_casesearch_strz(char *textz, char *needlez)
+{
+	str text;
+
+	text.s = textz;
+	text.len = strlen(textz);
+
+	return str_casesearch_strz(&text, needlez);
+}
+
+/**
+ * case insensitive search of a charz string 'needlez' inside str 'text'
+ */
+char *str_casesearch_strz(str *text, char *needlez)
+{
+	str needle;
+
+	needle.s = needlez;
+	needle.len = strlen(needlez);
+
+	return str_casesearch(text, &needle);
+}
+
 /*
  * ser_memmem() returns the location of the first occurrence of data
  * pattern b2 of size len2 in memory block b1 of size len1 or
diff --git a/src/core/ut.h b/src/core/ut.h
index 56c1f9e157..6ef2e079bc 100644
--- a/src/core/ut.h
+++ b/src/core/ut.h
@@ -1053,6 +1053,12 @@ char* get_abs_pathname(str* base, str* file);
  */
 char *str_search(str *text, str *needle);
 
+char *str_casesearch(str *text, str *needle);
+
+char *strz_casesearch_strz(char *textz, char *needlez);
+
+char *str_casesearch_strz(str *text, char *needlez);
+
 /*
  * ser_memmem() returns the location of the first occurrence of data
  * pattern b2 of size len2 in memory block b1 of size len1 or




More information about the sr-dev mailing list