Module: kamailio
Branch: master
Commit: 10bc5b244db34e57beb9e5b4ec546396fb12a76b
URL:
https://github.com/kamailio/kamailio/commit/10bc5b244db34e57beb9e5b4ec54639…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2021-06-08T13:25:54+02:00
pv: new variable $hflc(hname)
- return the number of bodies for known headers that can also be as a comma
separated list
- supported now is Via header
---
Modified: src/modules/pv/pv.c
Modified: src/modules/pv/pv_core.c
Modified: src/modules/pv/pv_core.h
---
Diff:
https://github.com/kamailio/kamailio/commit/10bc5b244db34e57beb9e5b4ec54639…
Patch:
https://github.com/kamailio/kamailio/commit/10bc5b244db34e57beb9e5b4ec54639…
---
diff --git a/src/modules/pv/pv.c b/src/modules/pv/pv.c
index 2738a8b7a2..3a904e3161 100644
--- a/src/modules/pv/pv.c
+++ b/src/modules/pv/pv.c
@@ -110,6 +110,8 @@ static pv_export_t mod_pvs[] = {
0, 0, 0},
{{"hfl", (sizeof("hfl")-1)}, PVT_HDR, pv_get_hfl, 0,
pv_parse_hfl_name,
pv_parse_index, 0, 0},
+ {{"hflc", (sizeof("hflc")-1)}, PVT_HDRC, pv_get_hflc, 0,
pv_parse_hfl_name,
+ 0, 0, 0},
{{"var", (sizeof("var")-1)}, PVT_SCRIPTVAR, pv_get_scriptvar,
pv_set_scriptvar, pv_parse_scriptvar_name, 0, 0, 0},
{{"vz", (sizeof("vz")-1)}, PVT_SCRIPTVAR, pv_get_scriptvar,
diff --git a/src/modules/pv/pv_core.c b/src/modules/pv/pv_core.c
index 1b39ef3fb8..a4bfe21985 100644
--- a/src/modules/pv/pv_core.c
+++ b/src/modules/pv/pv_core.c
@@ -2421,6 +2421,70 @@ int pv_get_hfl(sip_msg_t *msg, pv_param_t *param, pv_value_t *res)
return pv_get_hdr_helper(msg, param, res, &tv, idx, idxf);
}
+/**
+ *
+ */
+int pv_get_hflc(sip_msg_t *msg, pv_param_t *param, pv_value_t *res)
+{
+ pv_value_t tv = {0};
+ via_body_t *vb = NULL;
+ hdr_field_t *hf = NULL;
+ int n = 0;
+
+ if(msg==NULL || res==NULL || param==NULL)
+ return -1;
+
+ /* get the name */
+ if(param->pvn.type == PV_NAME_PVAR) {
+ if(pv_get_spec_name(msg, param, &tv)!=0 || (!(tv.flags&PV_VAL_STR))) {
+ LM_ERR("invalid name\n");
+ return pv_get_sintval(msg, param, res, 0);
+ }
+ } else {
+ if(param->pvn.u.isname.type == AVP_NAME_STR) {
+ tv.flags = PV_VAL_STR;
+ tv.rs = param->pvn.u.isname.name.s;
+ } else {
+ tv.flags = 0;
+ tv.ri = param->pvn.u.isname.name.n;
+ }
+ }
+
+ if (parse_headers(msg, HDR_EOH_F, 0)<0) {
+ LM_DBG("failed to parse sip headers\n");
+ return pv_get_sintval(msg, param, res, 0);
+ }
+
+ if((tv.flags == 0) && (tv.ri==HDR_VIA_T)) {
+ if(msg->h_via1==NULL) {
+ LM_WARN("no Via header\n");
+ return pv_get_sintval(msg, param, res, 0);
+ }
+ /* count Via header bodies */
+ for(hf=msg->h_via1; hf!=NULL; hf=hf->next) {
+ if(hf->type==HDR_VIA_T) {
+ for(vb=(via_body_t*)hf->parsed; vb!=NULL; vb=vb->next) {
+ n++;
+ }
+ }
+ }
+ return pv_get_sintval(msg, param, res, n);
+ }
+
+ for (hf=msg->headers; hf; hf=hf->next) {
+ if(tv.flags == 0) {
+ if (tv.ri==hf->type) {
+ n++;
+ }
+ } else {
+ if (cmp_hdrname_str(&hf->name, &tv.rs)==0) {
+ n++;
+ }
+ }
+ }
+ return pv_get_sintval(msg, param, res, n);
+}
+
/**
*
*/
diff --git a/src/modules/pv/pv_core.h b/src/modules/pv/pv_core.h
index 179df8fd0b..d001104647 100644
--- a/src/modules/pv/pv_core.h
+++ b/src/modules/pv/pv_core.h
@@ -255,6 +255,8 @@ int pv_get_hdrc(struct sip_msg *msg, pv_param_t *param, pv_value_t
*res);
int pv_get_hfl(sip_msg_t *msg, pv_param_t *param, pv_value_t *res);
+int pv_get_hflc(struct sip_msg *msg, pv_param_t *param, pv_value_t *res);
+
int pv_get_scriptvar(struct sip_msg *msg, pv_param_t *param,
pv_value_t *res);