diff --git a/src/modules/textopsx/doc/functions.xml b/src/modules/textopsx/doc/functions.xml index b43a0d4bb87..e1efc9efa65 100644 --- a/src/modules/textopsx/doc/functions.xml +++ b/src/modules/textopsx/doc/functions.xml @@ -618,6 +618,35 @@ hf_iterator_end("i1"); } hf_iterator_end("i1"); ... + + + +
+ + <function moreinfo="none">hf_iterator_insert(iname, htext)</function> + + + Add headers before the one at the current iterator possition. + + + The parameters can be dynamic strings with variables. + + + This function can be used from ANY_ROUTE. + + + <function>hf_iterator_insert</function> usage + +... + hf_iterator_start("i1"); + while(hf_iterator_next("i1")) { + if($hfitname(i1)=="My-Header") { + hf_iterator_insert("i1", "My-New-Header: abc\r\n"); + break; + } + } + hf_iterator_end("i1"); +...
diff --git a/src/modules/textopsx/textopsx.c b/src/modules/textopsx/textopsx.c index 297ff1098ed..b9f8c0af14c 100644 --- a/src/modules/textopsx/textopsx.c +++ b/src/modules/textopsx/textopsx.c @@ -78,6 +78,7 @@ static int w_hf_iterator_next(sip_msg_t *msg, char *piname, char *p2); static int w_hf_iterator_end(sip_msg_t *msg, char *piname, char *p2); static int w_hf_iterator_rm(sip_msg_t *msg, char *piname, char *p2); static int w_hf_iterator_append(sip_msg_t *msg, char *piname, char *phtext); +static int w_hf_iterator_insert(sip_msg_t *msg, char *piname, char *phtext); static int bind_textopsx(textopsx_api_t *tob); @@ -142,6 +143,8 @@ static cmd_export_t cmds[] = { fixup_free_spve_null, ANY_ROUTE}, {"hf_iterator_append", w_hf_iterator_append, 2, fixup_spve_spve, fixup_free_spve_spve, ANY_ROUTE}, + {"hf_iterator_insert", w_hf_iterator_insert, 2, fixup_spve_spve, + fixup_free_spve_spve, ANY_ROUTE}, {"bind_textopsx", (cmd_function)bind_textopsx, 1, 0, 0, ANY_ROUTE}, @@ -2117,6 +2120,62 @@ static int w_hf_iterator_append(sip_msg_t *msg, char *piname, char *phtext) return ki_hf_iterator_append(msg, &iname, &htext); } +/** + * + */ +static int ki_hf_iterator_insert(sip_msg_t *msg, str *iname, str *htext) +{ + int k; + sr_lump_t *anchor; + str sval = STR_NULL; + + k = ki_hf_iterator_index(msg, iname); + if(k<0 || _hf_iterators[k].it==NULL) { + return -1; + } + anchor = anchor_lump(msg, _hf_iterators[k].it->name.s - msg->buf, 0, 0); + if (anchor==0) { + LM_ERR("cannot insert hdr after %.*s\n", _hf_iterators[k].it->name.len, + _hf_iterators[k].it->name.s); + return -1; + } + sval.s = (char*)pkg_malloc(htext->len + 1); + if(sval.s==NULL) { + LM_ERR("failed to insert hdr after %.*s\n", _hf_iterators[k].it->name.len, + _hf_iterators[k].it->name.s); + return -1; + } + memcpy(sval.s, htext->s, htext->len); + sval.len = htext->len; + sval.s[sval.len] = '\0'; + + if (insert_new_lump_before(anchor, sval.s, sval.len, 0) == 0) { + LM_ERR("cannot insert lump\n"); + pkg_free(sval.s); + return -1; + } + return 1; +} + +/** + * + */ +static int w_hf_iterator_insert(sip_msg_t *msg, char *piname, char *phtext) +{ + str iname = STR_NULL; + str htext = STR_NULL; + if(fixup_get_svalue(msg, (gparam_t*)piname, &iname)<0) { + LM_ERR("failed to get iterator name\n"); + return -1; + } + if(fixup_get_svalue(msg, (gparam_t*)phtext, &htext)<0) { + LM_ERR("failed to get header text\n"); + return -1; + } + + return ki_hf_iterator_insert(msg, &iname, &htext); +} + /** * */ @@ -2735,6 +2794,16 @@ static sr_kemi_t sr_kemi_textopsx_exports[] = { { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } }, + { str_init("textopsx"), str_init("hf_iterator_append"), + SR_KEMIP_INT, ki_hf_iterator_append, + { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("textopsx"), str_init("hf_iterator_insert"), + SR_KEMIP_INT, ki_hf_iterator_insert, + { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, { {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } } };