TEXTOPS module
Admin Guide
Section titled “Admin Guide”Overview
Section titled “Overview”The module implements text based operations over the SIP message processed by OpenSIPS. SIP is a text based protocol and the module provides a large set of very useful functions to manipulate the message at text level, e.g., regular expression search and replace, Perl-like substitutions, etc.
Known Limitations
Section titled “Known Limitations”search ignores folded lines. For example, search(“(From|f):.*@foo.bar”) doesn’t match the following From header field:
From: medabeda <sip:medameda@foo.bar>;tag=1234Dependencies
Section titled “Dependencies”OpenSIPS Modules
Section titled “OpenSIPS Modules”The following modules must be loaded before this module:
- No dependencies on other OpenSIPS modules.
External Libraries or Applications
Section titled “External Libraries or Applications”The following libraries or applications must be installed before running OpenSIPS with this module loaded:
- None.
Exported Functions
Section titled “Exported Functions”search(re)
Section titled “search(re)”Searches for the re in the message.
Meaning of the parameters is as follows:
- re (string) - Regular expression.
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...if ( search("[Ss][Ii][Pp]") ) { /*....*/ };...search_body(re)
Section titled “search_body(re)”Searches for the re in the body of the message.
Meaning of the parameters is as follows:
- re (string) - Regular expression.
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...if ( search_body("[Ss][Ii][Pp]") ) { /*....*/ };...search_append(re, txt)
Section titled “search_append(re, txt)”Searches for the first match of re and appends txt after it.
Meaning of the parameters is as follows:
- re (string) - Regular expression.
- txt (string) - String to be appended.
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...search_append("[Oo]pen[Ss]er", " SIP Proxy");...search_append_body(re, txt)
Section titled “search_append_body(re, txt)”Searches for the first match of re in the body of the message and appends txt after it.
Meaning of the parameters is as follows:
- re (string) - Regular expression.
- txt (string) - String to be appended.
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...search_append_body("[Oo]pen[Ss]er", " SIP Proxy");...replace(re, txt)
Section titled “replace(re, txt)”Replaces the first occurrence of re with txt.
Meaning of the parameters is as follows:
- re (string) - Regular expression.
- txt (string)
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...replace("opensips", "Open SIP Server");...replace_body(re, txt)
Section titled “replace_body(re, txt)”Replaces the first occurrence of re in the body of the message with txt.
Meaning of the parameters is as follows:
- re (string) - Regular expression.
- txt (string)
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...replace_body("opensips", "Open SIP Server");...replace_all(re, txt)
Section titled “replace_all(re, txt)”Replaces all occurrence of re with txt.
Meaning of the parameters is as follows:
- re - (string) Regular expression.
- txt (string)
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...replace_all("opensips", "Open SIP Server");...replace_body_all(re, txt)
Section titled “replace_body_all(re, txt)”Replaces all occurrence of re in the body of the message with txt. Matching is done on a per-line basis.
Meaning of the parameters is as follows:
- re (string) - Regular expression.
- txt (string)
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...replace_body_all("opensips", "Open SIP Server");...replace_body_atonce(re, txt)
Section titled “replace_body_atonce(re, txt)”Replaces all occurrence of re in the body of the message with txt. Matching is done over the whole body.
Meaning of the parameters is as follows:
- re (string) - Regular expression.
- txt (string)
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...# strip the whole body from the message:if(has_body() && replace_body_atonce("^.+$", "")) remove_hf("Content-Type");...subst(‘/re/repl/flags’)
Section titled “subst(‘/re/repl/flags’)”Replaces re with repl (sed or perl like).
Meaning of the parameters is as follows:
- ‘/re/repl/flags’ (string) - sed like regular expression. flags can be a combination of i (case insensitive), g (global) or s (match newline don’t treat it as end of line). ‘re’ - is regular expression ‘repl’ - is replacement string - may contain pseudo-variables ‘flags’ - substitution flags (i - ignore case, g - global)
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...# replace the uri in to: with the message uri (just an example)if ( subst('/^To:(.*)sip:[^@]*@[a-zA-Z0-9.]+(.*)$/t:\1\u\2/ig') ) {};
# replace the uri in to: with the value of avp sip_address (just an example)if ( subst('/^To:(.*)sip:[^@]*@[a-zA-Z0-9.]+(.*)$/t:\1$avp(sip_address)\2/ig') ) {};
...subst_uri(‘/re/repl/flags’)
Section titled “subst_uri(‘/re/repl/flags’)”Runs the re substitution on the message uri (like subst but works only on the uri)
Meaning of the parameters is as follows:
- ‘/re/repl/flags’ (string) - sed like regular expression. flags can be a combination of i (case insensitive), g (global) or s (match newline don’t treat it as end of line). ‘re’ - is regular expression ‘repl’ - is replacement string - may contain pseudo-variables ‘flags’ - substitution flags (i - ignore case, g - global)
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...# adds 3463 prefix to numeric uris, and save the original uri (\0 match)# as a parameter: orig_uri (just an example)if (subst_uri('/^sip:([0-9]+)@(.*)$/sip:3463\1@\2;orig_uri=\0/i')){$
# adds the avp 'uri_prefix' as prefix to numeric uris, and save the original# uri (\0 match) as a parameter: orig_uri (just an example)if (subst_uri('/^sip:([0-9]+)@(.*)$/sip:$avp(uri_prefix)\1@\2;orig_uri=\0/i')){$
...subst_user(‘/re/repl/flags’)
Section titled “subst_user(‘/re/repl/flags’)”Runs the re substitution on the message uri (like subst_uri but works only on the user portion of the uri)
Meaning of the parameters is as follows:
- ‘/re/repl/flags’ (string) - sed like regular expression. flags can be a combination of i (case insensitive), g (global) or s (match newline don’t treat it as end of line). ‘re’ - is regular expression ‘repl’ - is replacement string - may contain pseudo-variables ‘flags’ - substitution flags (i - ignore case, g - global)
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...# adds 3463 prefix to uris ending with 3642 (just an example)if (subst_user('/3642$/36423463/')){$
...# adds avp 'user_prefix' as prefix to username in r-uri ending with 3642if (subst_user('/(.*)3642$/$avp(user_prefix)\13642/')){$...subst_body(‘/re/repl/flags’)
Section titled “subst_body(‘/re/repl/flags’)”Replaces re with repl (sed or perl like) in the body of the message.
Meaning of the parameters is as follows:
- ‘/re/repl/flags’ (string) - sed like regular expression. flags can be a combination of i (case insensitive), g (global) or s (match newline don’t treat it as end of line). ‘re’ - is regular expression ‘repl’ - is replacement string - may contain pseudo-variables ‘flags’ - substitution flags (i - ignore case, g - global)
This function can be used from REQUEST_ROUTE, ONREPLY_ROUTE, FAILURE_ROUTE, BRANCH_ROUTE.
...if (subst_body("/^o=([^ ]*) /o=$fU /")) xlog("successfully prepared an "o" line update!\n");...Contributors
Section titled “Contributors”By Commit Statistics
Section titled “By Commit Statistics”Top contributors by DevScore(1), authored commits(2) and lines added/removed(3)
| # | Name | DevScore | Commits | Lines++ | Lines— |
|---|---|---|---|---|---|
| 1. | Bogdan-Andrei Iancu (@bogdan-iancu) | 57 | 43 | 497 | 532 |
| 2. | Razvan Crainea (@razvancrainea) | 56 | 7 | 18 | 2874 |
| 3. | Daniel-Constantin Mierla (@miconda) | 40 | 28 | 949 | 212 |
| 4. | Andrei Dragus | 34 | 15 | 1603 | 259 |
| 5. | Andrei Pelinescu-Onciul | 28 | 21 | 459 | 147 |
| 6. | Jiri Kuthan (@jiriatipteldotorg) | 18 | 14 | 301 | 53 |
| 7. | Liviu Chircu (@liviuchircu) | 13 | 10 | 54 | 82 |
| 8. | Jan Janak (@janakj) | 12 | 6 | 496 | 27 |
| 9. | Vlad Patrascu (@rvlad-patrascu) | 10 | 5 | 129 | 147 |
| 10. | Stefan Darius (@dariusstefan) | 9 | 4 | 476 | 57 |
All remaining contributors: Juha Heinanen (@juha-h), Elena-Ramona Modroiu, Henning Westerholt (@henningw), Maksym Sobolyev (@sobomax), Ovidiu Sas (@ovidiusas), Anca Vamanu, Marc Haisenko, Andreas Heise, Klaus Darilion, Andreas Granig, Vlad Paiu (@vladpaiu), Hugues Mitonneau, Saúl Ibarra Corretgé (@saghul), Konstantin Bokarius, Peter Lemenkov (@lemenkov), Edson Gellert Schubert, Christophe Sollet (@csollet).
(1) DevScore = author_commits + author_lines_added / (project_lines_added / project_commits) + author_lines_deleted / (project_lines_deleted / project_commits)
(2) including any documentation-related commits, excluding merge commits
(3) ignoring whitespace edits, renamed files and auto-generated files
By Commit Activity
Section titled “By Commit Activity”| # | Name | Commit Activity |
|---|---|---|
| 1. | Stefan Darius (@dariusstefan) | Jun 2026 - Jul 2026 |
| 2. | Razvan Crainea (@razvancrainea) | Feb 2012 - Jun 2026 |
| 3. | Liviu Chircu (@liviuchircu) | Oct 2013 - May 2024 |
| 4. | Maksym Sobolyev (@sobomax) | Jul 2004 - Feb 2023 |
| 5. | Vlad Patrascu (@rvlad-patrascu) | May 2017 - Jul 2019 |
| 6. | Bogdan-Andrei Iancu (@bogdan-iancu) | Feb 2002 - Apr 2019 |
| 7. | Peter Lemenkov (@lemenkov) | Jun 2018 - Jun 2018 |
| 8. | Anca Vamanu | Oct 2008 - May 2011 |
| 9. | Ovidiu Sas (@ovidiusas) | Dec 2010 - Jan 2011 |
| 10. | Christophe Sollet (@csollet) | Dec 2010 - Dec 2010 |
All remaining contributors: Vlad Paiu (@vladpaiu), Andrei Dragus, Saúl Ibarra Corretgé (@saghul), Hugues Mitonneau, Andreas Granig, Daniel-Constantin Mierla (@miconda), Konstantin Bokarius, Edson Gellert Schubert, Henning Westerholt (@henningw), Juha Heinanen (@juha-h), Andreas Heise, Klaus Darilion, Marc Haisenko, Elena-Ramona Modroiu, Andrei Pelinescu-Onciul, Jan Janak (@janakj), Jiri Kuthan (@jiriatipteldotorg).
(1) including any documentation-related commits, excluding merge commits
Documentation
Section titled “Documentation”Contributors
Section titled “Contributors”Last edited by: Razvan Crainea (@razvancrainea), Liviu Chircu (@liviuchircu), Vlad Patrascu (@rvlad-patrascu), Peter Lemenkov (@lemenkov), Bogdan-Andrei Iancu (@bogdan-iancu), Ovidiu Sas (@ovidiusas), Andrei Dragus, Anca Vamanu, Andreas Granig, Daniel-Constantin Mierla (@miconda), Konstantin Bokarius, Edson Gellert Schubert, Juha Heinanen (@juha-h), Klaus Darilion, Marc Haisenko, Elena-Ramona Modroiu, Jan Janak (@janakj), Maksym Sobolyev (@sobomax), Jiri Kuthan (@jiriatipteldotorg), Andrei Pelinescu-Onciul.
License
Section titled “License”All documentation files (i.e. .md extension) are licensed under the Creative Common License 4.0