Module: sip-router
Branch: master
Commit: 378bd71de3b035b497469f89a640931d0792ce4f
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=378bd71…
Author: Peter Dunkley <peter.dunkley(a)crocodilertc.net>
Committer: Peter Dunkley <peter.dunkley(a)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_ */