[sr-dev] git:master: xhttp: cache the URL string when performing transformations so sequential transformations on the same string do not require a reparse .

Peter Dunkley peter.dunkley at crocodile-rcs.com
Fri Sep 27 00:28:35 CEST 2013


Module: sip-router
Branch: master
Commit: ac5d846e2e472b1c097992bc2bdcfb58100c6eaa
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ac5d846e2e472b1c097992bc2bdcfb58100c6eaa

Author: Peter Dunkley <peter.dunkley at crocodilertc.net>
Committer: Peter Dunkley <peter.dunkley at crocodilertc.net>
Date:   Thu Sep 26 23:27:31 2013 +0100

xhttp: cache the URL string when performing transformations so sequential transformations on the same string do not require a reparse.

---

 modules/xhttp/xhttp_trans.c |   40 ++++++++++++++++++++++++++++++----------
 1 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/modules/xhttp/xhttp_trans.c b/modules/xhttp/xhttp_trans.c
index 35c1609..36c5888 100644
--- a/modules/xhttp/xhttp_trans.c
+++ b/modules/xhttp/xhttp_trans.c
@@ -30,6 +30,9 @@ enum _tr_xhttpurl_subtype { TR_XHTTPURL_NONE = 0, TR_XHTTPURL_PATH,
 enum _tr_xhttpquerystring_subtype { TR_XHTTPUTLQUERYSTRING_NONE = 0,
 	TR_XHTTPURLQUERYSTRING_VALUE};
 
+static str _httpurl_str = {0, 0};
+static int _httpurl_querystring_pos = 0;
+
 int xhttp_tr_eval_xhttpurl(struct sip_msg *msg, tr_param_t *tp, int subtype,
 		pv_value_t *val)
 {
@@ -44,28 +47,45 @@ int xhttp_tr_eval_xhttpurl(struct sip_msg *msg, tr_param_t *tp, int subtype,
 		val->flags = PV_VAL_STR;
 	}
 
+	if (_httpurl_str.len == 0 || _httpurl_str.len != val->rs.len
+		|| strncmp(_httpurl_str.s, val->rs.s, val->rs.len) != 0)
+	{
+		if (val->rs.len > _httpurl_str.len)
+		{
+			if (_httpurl_str.s) pkg_free(_httpurl_str.s);
+			_httpurl_str.s = (char *) pkg_malloc(
+					(val->rs.len + 1) * sizeof(char));
+			if (_httpurl_str.s == NULL)
+			{
+				LM_ERR("allocating package memory\n");
+				memset(&_httpurl_str.s, 0, sizeof(str));
+				return -1;
+			}
+		}
+		_httpurl_str.len = val->rs.len;
+		memcpy(_httpurl_str.s, val->rs.s, val->rs.len);
+
+		while (val->rs.s[pos] != '?' && pos < val->rs.len) pos++;
+		_httpurl_querystring_pos = (pos >= val->rs.len) ? 0 : pos + 1;
+	}
+
 	switch (subtype)
 	{
 	case TR_XHTTPURL_PATH:
-		while (val->rs.s[pos] != '?' && pos < val->rs.len)
-			pos++;
-
-		val->rs.len = pos;
+		val->rs.len = (_httpurl_querystring_pos == 0)
+				? val->rs.len : _httpurl_querystring_pos - 1;
 		break;
 
 	case TR_XHTTPURL_QUERYSTRING:
-		while (val->rs.s[pos] != '?' && pos < val->rs.len)
-			pos++;
-
-		if (pos >= val->rs.len)
+		if (_httpurl_querystring_pos == 0)
 		{
 			val->rs.s[0] = '\0';
 			val->rs.len = 0;
 			break;
 		}
 
-		val->rs.s = &val->rs.s[pos + 1];
-		val->rs.len = val->rs.len - pos - 1;
+		val->rs.s = &val->rs.s[_httpurl_querystring_pos];
+		val->rs.len = val->rs.len - _httpurl_querystring_pos;
 		break;
 
 	default:




More information about the sr-dev mailing list