Module: kamailio
Branch: master
Commit: bfe69eda32ee23ebd532f673f76d335ff51f13cd
URL: 
https://github.com/kamailio/kamailio/commit/bfe69eda32ee23ebd532f673f76d335ff51f13cd

Author: Daniel-Constantin Mierla <mico...@gmail.com>
Committer: Daniel-Constantin Mierla <mico...@gmail.com>
Date: 2025-04-10T08:56:37+02:00

core: helper function to remove param from uri

---

Modified: src/core/dset.c
Modified: src/core/dset.h

---

Diff:  
https://github.com/kamailio/kamailio/commit/bfe69eda32ee23ebd532f673f76d335ff51f13cd.diff
Patch: 
https://github.com/kamailio/kamailio/commit/bfe69eda32ee23ebd532f673f76d335ff51f13cd.patch

---

diff --git a/src/core/dset.c b/src/core/dset.c
index e30277eb7ea..d449f33e325 100644
--- a/src/core/dset.c
+++ b/src/core/dset.c
@@ -33,6 +33,7 @@
 #include "config.h"
 #include "parser/parser_f.h"
 #include "parser/parse_uri.h"
+#include "parser/parse_param.h"
 #include "parser/msg_parser.h"
 #include "globals.h"
 #include "ut.h"
@@ -1317,6 +1318,85 @@ int ksr_uri_alias_decode(str *ualias, str *ouri)
        return -1;
 }
 
+/**
+ * remove param from ouri, storing in nuri
+ * - nuri->len has to be set to the size of nuri->s buffer
+ */
+int ksr_uri_remove_param(str *ouri, str *pname, str *nuri)
+{
+       str t;
+       str pstart;
+       sip_uri_t puri;
+       param_hooks_t hooks;
+       param_t *params, *pit;
+
+       if(nuri->len < ouri->len + 1) {
+               LM_ERR("output buffer too small (%d / %d)\n", nuri->len, 
ouri->len);
+               return -1;
+       }
+       if(parse_uri(ouri->s, ouri->len, &puri) < 0) {
+               LM_ERR("failed to parse uri [%.*s]\n", ouri->len, ouri->s);
+               return -1;
+       }
+       if(puri.sip_params.len > 0) {
+               t = puri.sip_params;
+       } else if(puri.params.len > 0) {
+               t = puri.params;
+       } else {
+               LM_DBG("no uri params [%.*s]\n", ouri->len, ouri->s);
+               memcpy(nuri->s, ouri->s, ouri->len);
+               nuri->len = ouri->len;
+               nuri->s[nuri->len] = 0;
+               return 0;
+       }
+
+       if(parse_params(&t, CLASS_ANY, &hooks, &params) < 0) {
+               LM_ERR("ruri parameter parsing failed\n");
+               return -1;
+       }
+
+       for(pit = params; pit; pit = pit->next) {
+               if((pit->name.len == pname->len)
+                               && (strncasecmp(pit->name.s, pname->s, 
pname->len) == 0)) {
+                       break;
+               }
+       }
+       if(pit == NULL) {
+               LM_DBG("uri param [%.*s] not found\n", pname->len, pname->s);
+               free_params(params);
+               memcpy(nuri->s, ouri->s, ouri->len);
+               nuri->len = ouri->len;
+               nuri->s[nuri->len] = 0;
+               return 0;
+       }
+
+       pstart.s = pit->name.s;
+       while(pstart.s > ouri->s && *pstart.s != ';') {
+               pstart.s--;
+       }
+       memcpy(nuri->s, ouri->s, pstart.s - ouri->s);
+       nuri->len = pstart.s - ouri->s;
+
+       if(pit->body.len > 0) {
+               if(pit->body.s + pit->body.len < ouri->s + ouri->len) {
+                       memcpy(nuri->s + nuri->len, pit->body.s + pit->body.len,
+                                       ouri->s + ouri->len - pit->body.s - 
pit->body.len);
+                       nuri->len += ouri->s + ouri->len - pit->body.s - 
pit->body.len;
+               }
+       } else {
+               if(pit->name.s + pit->name.len < ouri->s + ouri->len) {
+                       memcpy(nuri->s + nuri->len, pit->name.s + pit->name.len,
+                                       ouri->s + ouri->len - pit->name.s - 
pit->name.len);
+                       nuri->len += ouri->s + ouri->len - pit->name.s - 
pit->name.len;
+               }
+       }
+       nuri->s[nuri->len] = 0;
+
+       free_params(params);
+
+       return 0;
+}
+
 /* address of record (aor) management */
 
 /* address of record considered case sensitive
diff --git a/src/core/dset.h b/src/core/dset.h
index d735f49d9f4..a46639a1adb 100644
--- a/src/core/dset.h
+++ b/src/core/dset.h
@@ -291,6 +291,7 @@ int uri_restore_rcv_alias(str *uri, str *nuri, str *suri);
 int uri_trim_rcv_alias(str *uri, str *nuri);
 int ksr_uri_alias_encode(str *iuri, str *ualias);
 int ksr_uri_alias_decode(str *ualias, str *ouri);
+int ksr_uri_remove_param(str *ouri, str *pname, str *nuri);
 
 int init_dst_set(void);
 

_______________________________________________
Kamailio - Development Mailing List -- sr-dev@lists.kamailio.org
To unsubscribe send an email to sr-dev-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to