@ -481,7 +481,7 @@
+
--- /dev/null
+++ b/src/modules/pv_headers/pv_headers.c
@@ -0,0 +1,18 06 @@
@@ -0,0 +1,18 1 0 @@
+/*
+ * pv_headers
+ *
@ -713,11 +713,13 @@
+ char hvals[header_name_size][header_value_size];
+ int idx = 0, d_size = 0;
+ str val_part = STR_NULL;
+ int br_idx;
+
+ if (isbflagset(0, FL_PV_HDRS_COLLECTED) == 1 &&
+ isflagset(msg, FL_PV_HDRS_COLLECTED) == 1) {
+ LM_ERR("headers are already collected\n");
+ return -1;
+ pv_get_branch_index(msg, &br_idx);
+
+ if (isbflagset(br_idx, FL_PV_HDRS_COLLECTED) == 1) {
+ LM_ERR("headers are already collected\n");
+ return -1;
+ }
+
+ if (parse_headers(msg, HDR_EOH_F, 0) < 0) {
@ -764,8 +766,7 @@
+ pv_str_free(&name);
+ pv_str_free(&val);
+
+ setbflag(0, FL_PV_HDRS_COLLECTED);
+ setflag(msg, FL_PV_HDRS_COLLECTED);
+ setbflag(br_idx, FL_PV_HDRS_COLLECTED);
+
+ return 1;
+
@ -786,10 +787,11 @@
+ str br_xname = STR_NULL;
+ int br_idx;
+
+ if (isbflagset(0, FL_PV_HDRS_APPLIED) == 1 &&
+ isflagset(msg, FL_PV_HDRS_APPLIED) == 1) {
+ LM_ERR("headers are already applied\n");
+ return -1;
+ pv_get_branch_index(msg, &br_idx);
+
+ if (isbflagset(br_idx, FL_PV_HDRS_APPLIED) == 1) {
+ LM_ERR("headers are already applied\n");
+ return -1;
+ }
+
+ if (parse_headers(msg, HDR_EOH_F, 0) < 0) {
@ -801,7 +803,6 @@
+ if (pv_str_new(&uri, header_value_size) < 0) goto err;
+ if (pv_str_new(&br_xname, header_value_size) < 0) goto err;
+
+ pv_get_branch_index(msg, &br_idx);
+ pv_get_branch_xname(msg, &xavp_name, &br_xname);
+
+ if ((xavp = xavp_get(&br_xname, NULL)) == NULL &&
@ -911,13 +912,14 @@
+ }
+ } while ((sub = sub->next) != NULL);
+
+ if (br_idx > 0)
+ setbflag(br_idx, FL_PV_HDRS_APPLIED);
+
+ pv_str_free(&display);
+ pv_str_free(&uri);
+ pv_str_free(&br_xname);
+ pv_str_hash_free(&rm_hdrs);
+
+ setbflag(0, FL_PV_HDRS_APPLIED);
+ setflag(msg, FL_PV_HDRS_APPLIED);
+
+ return 1;
+
@ -932,20 +934,20 @@
+int pv_reset_headers(struct sip_msg *msg, char *_s1, char *_s2)
+{
+ str br_xname = STR_NULL;
+ int br_idx;
+
+ if (pv_str_new(&br_xname, header_name_size) < 0)
+ return -1;
+
+ pv_get_branch_index(msg, &br_idx);
+ pv_get_branch_xname(msg, &xavp_name, &br_xname);
+
+ pv_free_xavp(&br_xname);
+ pv_get_branch_xname(msg, &xavp_parsed_xname, &br_xname);
+ pv_free_xavp(&br_xname);
+
+ resetbflag(0, FL_PV_HDRS_COLLECTED);
+ resetflag(msg, FL_PV_HDRS_COLLECTED);
+ resetbflag(0, FL_PV_HDRS_APPLIED);
+ resetflag(msg, FL_PV_HDRS_APPLIED);
+ resetbflag(br_idx, FL_PV_HDRS_COLLECTED);
+ resetbflag(br_idx, FL_PV_HDRS_APPLIED);
+
+ pv_str_free(&br_xname);
+
@ -2212,13 +2214,15 @@
+{
+ qvalue_t q;
+ int br_len;
+ str ruid ;
+ str ruid = STR_NULL ;
+
+ *br_idx = 0;
+ while ((get_branch(*br_idx,&br_len,&q,0,0,0,0,&ruid,0,0))) {
+ if (strcmp(msg->ruid.s, ruid.s) == 0)
+ break;
+ (*br_idx)++;
+ if (br_len == 0 || msg->ruid.s == NULL || ruid.s == NULL ||
+ strcmp(msg->ruid.s, ruid.s) == 0) {
+ break;
+ }
+ }
+
+ return 1;