[sr-dev] git:master: xhttp: added transformation to break a URL into "path" and " querystring"

Peter Dunkley peter.dunkley at crocodile-rcs.com
Wed Sep 25 17:13:34 CEST 2013


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

Author: Peter Dunkley <peter.dunkley at crocodilertc.net>
Committer: Peter Dunkley <peter.dunkley at crocodilertc.net>
Date:   Wed Sep 25 16:12:50 2013 +0100

xhttp: added transformation to break a URL into "path" and "querystring"

---

 modules/xhttp/xhttp_mod.c   |   13 +++++
 modules/xhttp/xhttp_trans.c |  125 +++++++++++++++++++++++++++++++++++++++++++
 modules/xhttp/xhttp_trans.h |   30 ++++++++++
 3 files changed, 168 insertions(+), 0 deletions(-)

diff --git a/modules/xhttp/xhttp_mod.c b/modules/xhttp/xhttp_mod.c
index 23ac3c4..9848892 100644
--- a/modules/xhttp/xhttp_mod.c
+++ b/modules/xhttp/xhttp_mod.c
@@ -45,6 +45,7 @@
 #include "../../pvar.h"
 
 #include "api.h"
+#include "xhttp_trans.h"
 
 MODULE_VERSION
 
@@ -106,6 +107,13 @@ struct module_exports exports= {
 	0           /* per-child init function */
 };
 
+static tr_export_t mod_trans[] = {
+	{ {"url", sizeof("url")-1},
+		xhttp_tr_parse_url },
+
+	{ { 0, 0 }, 0 }
+};
+
 /** 
  * 
  */
@@ -162,6 +170,11 @@ static int mod_init(void)
 	return 0;
 }
 
+int mod_register(char *path, int *dlflags, void *p1, void *p2)
+{
+	return register_trans_mod(path, mod_trans);
+}
+
 /** 
  * 
  */
diff --git a/modules/xhttp/xhttp_trans.c b/modules/xhttp/xhttp_trans.c
new file mode 100644
index 0000000..35c1609
--- /dev/null
+++ b/modules/xhttp/xhttp_trans.c
@@ -0,0 +1,125 @@
+/* 
+ * $Id$
+ *
+ * Copyright (C) 2013 Crocodile RCS Ltd
+ *
+ * This file is part of Kamailio, a free SIP server.
+ *
+ * Kamailio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * Kamailio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License 
+ * along with this program; if not, write to the Free Software 
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include "../../pvar.h"
+#include "../../str.h"
+#include "../../trim.h"
+#include "xhttp_trans.h"
+
+enum _tr_xhttp_type { TR_XHTTP_NONE = 0, TR_XHTTPURL, TR_XHTTPURLQUERYSTRING };
+enum _tr_xhttpurl_subtype { TR_XHTTPURL_NONE = 0, TR_XHTTPURL_PATH,
+	TR_XHTTPURL_QUERYSTRING};
+enum _tr_xhttpquerystring_subtype { TR_XHTTPUTLQUERYSTRING_NONE = 0,
+	TR_XHTTPURLQUERYSTRING_VALUE};
+
+int xhttp_tr_eval_xhttpurl(struct sip_msg *msg, tr_param_t *tp, int subtype,
+		pv_value_t *val)
+{
+	int pos = 0;
+
+	if (val == NULL || val->flags & PV_VAL_NULL)
+		return -1;
+
+	if (!(val->flags & PV_VAL_STR))
+	{
+		val->rs.s = int2str(val->ri, &val->rs.len);
+		val->flags = PV_VAL_STR;
+	}
+
+	switch (subtype)
+	{
+	case TR_XHTTPURL_PATH:
+		while (val->rs.s[pos] != '?' && pos < val->rs.len)
+			pos++;
+
+		val->rs.len = pos;
+		break;
+
+	case TR_XHTTPURL_QUERYSTRING:
+		while (val->rs.s[pos] != '?' && pos < val->rs.len)
+			pos++;
+
+		if (pos >= val->rs.len)
+		{
+			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;
+		break;
+
+	default:
+		LM_ERR("unknown subtype %d\n", subtype);
+		return -1;
+	}
+
+	return 0;
+}
+
+char *xhttp_tr_parse_url(str *in, trans_t *t)
+{
+	char *p;
+	str name;
+
+	if (in == NULL || in->s == NULL || t == NULL)
+		return NULL;
+
+	p = in->s;
+	name.s = in->s;
+	t->type = TR_XHTTPURL;
+	t->trf = xhttp_tr_eval_xhttpurl;
+
+        /* find next token */
+        while (is_in_str(p, in) && *p != TR_PARAM_MARKER && *p != TR_RBRACKET)
+	{
+		p++;
+	}
+
+        if (*p == '\0')
+        {
+                LM_ERR("invalid transformation: %.*s\n", in->len, in->s);
+                goto error;
+        }
+        name.len = p - name.s;
+        trim(&name);
+
+	if (name.len == 4 && strncasecmp(name.s, "path", 4) == 0)
+	{
+		t->subtype = TR_XHTTPURL_PATH;
+		goto done;
+	}
+	else if (name.len == 11 && strncasecmp(name.s, "querystring", 11) == 0)
+	{
+		t->subtype = TR_XHTTPURL_QUERYSTRING;
+		goto done;
+	}
+
+	LM_ERR("unknown transformation: %.*s/%.*s/%d!\n", in->len, in->s,
+			name.len, name.s, name.len);
+error:
+	return NULL;
+
+done:
+	t->name = name;
+	return p;
+}
diff --git a/modules/xhttp/xhttp_trans.h b/modules/xhttp/xhttp_trans.h
new file mode 100644
index 0000000..0f27ca8
--- /dev/null
+++ b/modules/xhttp/xhttp_trans.h
@@ -0,0 +1,30 @@
+/* 
+ * $Id$
+ *
+ * Copyright (C) 2013 Crocodile RCS Ltd
+ *
+ * This file is part of Kamailio, a free SIP server.
+ *
+ * Kamailio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * Kamailio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License 
+ * along with this program; if not, write to the Free Software 
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef XHTTP_TRANS_H_
+#define XHTTP_TRANS_H_
+
+#include "../../pvar.h"
+#include "../../str.h"
+
+char *xhttp_tr_parse_url(str *in, trans_t *t);
+
+#endif /* XHTTP_TRANS_H_ */




More information about the sr-dev mailing list