Module: kamailio
Branch: master
Commit: 0eb8c03c9c73d14d288a4993b30fecf6e244be13
URL:
https://github.com/kamailio/kamailio/commit/0eb8c03c9c73d14d288a4993b30fecf…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: GitHub <noreply(a)github.com>
Date: 2018-10-05T07:19:27+02:00
Merge pull request #1666 from kamailio/lazedo/is-uri
siputils: add is_uri function
---
Modified: src/modules/siputils/checks.c
Modified: src/modules/siputils/checks.h
Modified: src/modules/siputils/doc/siputils_admin.xml
Modified: src/modules/siputils/siputils.c
---
Diff:
https://github.com/kamailio/kamailio/commit/0eb8c03c9c73d14d288a4993b30fecf…
Patch:
https://github.com/kamailio/kamailio/commit/0eb8c03c9c73d14d288a4993b30fecf…
---
diff --git a/src/modules/siputils/checks.c b/src/modules/siputils/checks.c
index 0a33bddbd6..b700c620c0 100644
--- a/src/modules/siputils/checks.c
+++ b/src/modules/siputils/checks.c
@@ -129,6 +129,37 @@ int w_has_totag(struct sip_msg* _m, char* _foo, char* _bar)
return has_totag(_m);
}
+/*
+ * Check if pseudo variable contains a valid uri
+ */
+int is_uri(struct sip_msg* _m, char* _sp, char* _s2)
+{
+ pv_spec_t *sp;
+ pv_value_t pv_val;
+ sip_uri_t turi;
+
+ sp = (pv_spec_t *)_sp;
+
+ if (sp && (pv_get_spec_value(_m, sp, &pv_val) == 0)) {
+ if (pv_val.flags & PV_VAL_STR) {
+ if (pv_val.rs.len == 0 || pv_val.rs.s == NULL) {
+ LM_DBG("missing argument\n");
+ return -1;
+ }
+ if(parse_uri(pv_val.rs.s, pv_val.rs.len, &turi)!=0) {
+ return -1;
+ }
+ return 1;
+ } else {
+ LM_ERR("pseudo variable value is not string\n");
+ return -1;
+ }
+ } else {
+ LM_ERR("failed to get pseudo variable value\n");
+ return -1;
+ }
+}
+
/*
* Check if the username matches the username in credentials
*/
diff --git a/src/modules/siputils/checks.h b/src/modules/siputils/checks.h
index 39a575d94c..a9186386a2 100644
--- a/src/modules/siputils/checks.h
+++ b/src/modules/siputils/checks.h
@@ -75,6 +75,10 @@ int add_uri_param(struct sip_msg* _msg, char* _param, char* _s2);
*/
int tel2sip(struct sip_msg* _msg, char* _uri, char* _hostpart, char* _res);
+/*
+ * Check if pseudo variable contains a valid uri
+ */
+int is_uri(struct sip_msg* _m, char* _sp, char* _s2);
/*
* Check if user part of URI in pseudo variable is an e164 number
diff --git a/src/modules/siputils/doc/siputils_admin.xml
b/src/modules/siputils/doc/siputils_admin.xml
index d55641d9f1..c022dd2dd1 100644
--- a/src/modules/siputils/doc/siputils_admin.xml
+++ b/src/modules/siputils/doc/siputils_admin.xml
@@ -608,6 +608,33 @@ if (is_uri_user_e164("$avp(i:705)") {
</example>
</section>
+ <section id="siputils.f.is_uri">
+ <title>
+ <function
moreinfo="none">is_uri(pseudo-variable)</function>
+ </title>
+ <para>
+ Checks if string value of pseudo variable argument is a
+ valid uri.
+ </para>
+ <para>
+ This function can be used from ANY_ROUTE.
+ </para>
+ <example>
+ <title><function>is_uri</function> usage</title>
+ <programlisting format="linespecific">
+...
+if (is_uri("$var(x)")) { # Check if variable contains a uri
+ ...
+}
+if (is_uri("$avp(i:705)") {
+ # Check value stored in avp i:705
+ ...
+};
+...
+</programlisting>
+ </example>
+ </section>
+
<section id="siputils.f.is_tel_number">
<title>
<function moreinfo="none">is_tel_number(tval)</function>
diff --git a/src/modules/siputils/siputils.c b/src/modules/siputils/siputils.c
index af8cb29d4b..50cd7425aa 100644
--- a/src/modules/siputils/siputils.c
+++ b/src/modules/siputils/siputils.c
@@ -137,6 +137,8 @@ static cmd_export_t cmds[]={
free_fixup_get_uri_param, REQUEST_ROUTE|LOCAL_ROUTE},
{"tel2sip", (cmd_function)tel2sip, 3, fixup_tel2sip, 0,
REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE|ONREPLY_ROUTE},
+ {"is_uri", (cmd_function)is_uri, 1, fixup_pvar_null,
+ fixup_free_pvar_null, ANY_ROUTE},
{"is_e164", (cmd_function)is_e164, 1, fixup_pvar_null,
fixup_free_pvar_null, REQUEST_ROUTE|FAILURE_ROUTE|LOCAL_ROUTE},
{"is_uri_user_e164", (cmd_function)w_is_uri_user_e164, 1, fixup_pvar_null,