Przeglądaj źródła

kazoo : fix json transform

$(kzE{Element[$var(idx)]}) was not evaluating $var(idx)
Luis Azedo 10 lat temu
rodzic
commit
a3f0fa72c7
2 zmienionych plików z 21 dodań i 3 usunięć
  1. 1 1
      modules/kazoo/kz_json.c
  2. 20 2
      modules/kazoo/kz_trans.c

+ 1 - 1
modules/kazoo/kz_json.c

@@ -122,7 +122,7 @@ int kz_json_get_field_ex(str* json, str* field, pv_value_p dst_val)
 				str field = str_init(*(tokens + i));
 				// check for idx []
 				int sresult = sscanf(field.s, "%[^[][%[^]]]", f1, f2); //, f3);
-				LM_DBG("CHECK IDX %d - %s , %s, %s\n", sresult, field.s, f1, f2);
+				LM_DBG("CHECK IDX %d - %s , %s, %s\n", sresult, field.s, f1, (sresult > 1? f2 : "(null)"));
 
 				jtree = kz_json_get_object(jtree, f1);
 				if(jtree != NULL) {

+ 20 - 2
modules/kazoo/kz_trans.c

@@ -46,6 +46,9 @@
 #include "../../parser/parse_nameaddr.h"
 
 #include "../../lib/kcore/strcommon.h"
+
+#include "../../mod_fix.h"
+
 #include "kz_trans.h"
 #include "kz_json.h"
 #include "kz_amqp.h"
@@ -191,6 +194,8 @@ int kz_tr_eval(struct sip_msg *msg, tr_param_t *tp, int subtype, pv_value_t *val
 	str sv;
 	pv_value_t* pv;
 	pv_value_t v;
+    str v2 = {0,0};
+	void* v1 = NULL;
 
 	if(val==NULL || (val->flags&PV_VAL_NULL))
 		return -1;
@@ -249,7 +254,18 @@ int kz_tr_eval(struct sip_msg *msg, tr_param_t *tp, int subtype, pv_value_t *val
 
 			if(tp->type == TR_PARAM_STRING)
 			{
-				sv = tp->v.s;
+				v1 = tp->v.s.s;
+				if(fixup_spve_null(&v1, 1) != 0) {
+					LM_ERR("cannot get spve_value from TR_PARAM_STRING : %.*s\n", tp->v.s.len, tp->v.s.s);
+					return -1;
+				}
+				if (fixup_get_svalue(msg, (gparam_p)v1, &v2) != 0) {
+					LM_ERR("cannot get value from TR_PARAM_STRING\n");
+					fixup_free_spve_null(&v1, 1);
+					return -1;
+				}
+				fixup_free_spve_null(&v1, 1);
+				sv = v2;
 			} else {
 				if(pv_get_spec_value(msg, (pv_spec_p)tp->v.data, &v)!=0
 						|| (!(v.flags&PV_VAL_STR)) || v.rs.len<=0)
@@ -337,8 +353,10 @@ int kz_tr_eval(struct sip_msg *msg, tr_param_t *tp, int subtype, pv_value_t *val
 		} \
 		memset(_tp, 0, sizeof(tr_param_t)); \
 		_tp->type = TR_PARAM_STRING; \
-		_tp->v.s.s = _ps; \
 		_tp->v.s.len = _p - _ps; \
+		_tp->v.s.s = (char*)malloc((tp->v.s.len+1)*sizeof(char)); \
+		strncpy(_tp->v.s.s, _ps, tp->v.s.len); \
+		_tp->v.s.s[tp->v.s.len] = '\0'; \
 		_kz_parse_params[_kz_tr_parse_params++] = _tp; \
 	}