You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kamailio/obsolete/textops
Victor Seva 4a31eece25
upstream 4.0.1 version. No sipwise patches.
13 years ago
..
doc upstream 4.0.1 version. No sipwise patches. 13 years ago
Makefile upstream 4.0.1 version. No sipwise patches. 13 years ago
README upstream 4.0.1 version. No sipwise patches. 13 years ago
textops.c upstream 4.0.1 version. No sipwise patches. 13 years ago

README

1. Textops Module

Andrei Pelinescu-Onciul

   FhG FOKUS

   Copyright © 2003 FhG FOKUS
     __________________________________________________________________

   1.1. Overview

        1.1.1. Known Limitations

   1.2. Functions

        1.2.1. search(re)
        1.2.2. search_append(re, txt)
        1.2.3. replace(re, txt)
        1.2.4. subst('/re/repl/flags')
        1.2.5. subst_uri('/re/repl/flags')
        1.2.6. subst_user('/re/repl/flags')
        1.2.7. append_to_reply(txt)
        1.2.8. append_hf(hf)
        1.2.9. append_urihf(prefix, suffix)
        1.2.10. is_present_hf(hf_name)
        1.2.11. append_time()
        1.2.12. remove_hf(hf_name)
        1.2.13. remove_hf_re(reg_exp)
        1.2.14. append_hf_value(hf, xl_value)
        1.2.15. insert_hf_value(hf, xl_value)
        1.2.16. remove_hf_value(hf_par)
        1.2.17. remove_hf_value2(hf_par)
        1.2.18. assign_hf_value(hf, xl_value)
        1.2.19. assign_hf_value2(hf, xl_value)
        1.2.20. include_hf_value(hf, xl_value)
        1.2.21. exclude_hf_value(hf, xl_value)
        1.2.22. hf_value_exists(hf, xl_value)
        1.2.23. @hf_value selects

1.1. Overview

   This is mostly an example module. It implements text based operation
   (search, replace, append a.s.o). Many functions support xl_lib
   formating using xprint module.

1.1.1. 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=1234

1.2. Functions

1.2.1.  search(re)

   Searches for the re in the message.

   Meaning of the parameters is as follows:
     * re - Regular expression.

   Example 1. search usage
...
if ( search("[Ss][Ee][Rr]" ) { /*....*/ };
...

1.2.2.  search_append(re, txt)

   Searches for the first match of re and appends txt after it.

   Meaning of the parameters is as follows:
     * re - Regular expression.
     * txt - String to be appended. Xl_lib formatting supported.

   Example 2. search_append usage
...
search_append("[Ss]er", " blabla");
...

1.2.3.  replace(re, txt)

   Replaces the first occurrence of re with txt.

   Meaning of the parameters is as follows:
     * re - Regular expression.
     * txt - String. Xl_lib formatting supported.

   Example 3. replace usage
...
replace("ser", "Sip Express Router");
...

1.2.4.  subst('/re/repl/flags')

   Replaces re with repl (sed or perl like).

   Meaning of the parameters is as follows:
     * '/re/repl/flags' - 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).

   Example 4. subst usage
...
# 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') ) {};
...

1.2.5.  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' - 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).

   Example 5. subst usage
...
# 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')){$
...

1.2.6.  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' - 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).

   Example 6. subst usage
...
# adds 3463 prefix to uris ending with 3642 (just an example)
if (subst_user('/3642$/36423463/')){$
...

1.2.7.  append_to_reply(txt)

   Append txt to the reply.

   Meaning of the parameters is as follows:
     * txt - String. Xl_lib formatting supported.

   Example 7. append_to_reply usage
...
append_to_reply("Foo: bar\r\n");
...

1.2.8.  append_hf(hf)

   Appends txt after the last header field.

   Meaning of the parameters is as follows:
     * hf - Header field to be appended. Xl_lib formatting supported.

   Example 8. append_hf usage
...
append_hf("P-hint: VOICEMAIL\r\n");
...

1.2.9.  append_urihf(prefix, suffix)

   Append header field name with original Request-URI in middle.

   Meaning of the parameters is as follows:
     * prefix - string (usually at least header field name). Xl_lib
       formatting supported.
     * suffix - string (usually at least line terminator). Xl_lib
       formatting supported.

   Example 9. append_urihf usage
...
append_urihf("CC-Diversion: ", "\r\n");
...

1.2.10.  is_present_hf(hf_name)

   Return true if a header field is present in message.

Note

   Takes header field names "as is" and doesn't distinguish compact names.

   Meaning of the parameters is as follows:
     * hf_name - Header field name.

   Example 10. is_present_hf usage
...
if (is_present_hf("From")) log(1, "From HF Present");
...

1.2.11.  append_time()

   Append "Date" header containing the current date and time to the reply
   generated by SER.

   Example 11. is_present_hf usage
...
if (method == "REGISTER" ) {
    # Many user agents can use the Date header field
    # in 200 OK replies to REGISTER to synchronize
    # internal clock
    append_time();
};
...

1.2.12.  remove_hf(hf_name)

   Remove from the message all the headers with the specified name.

   Meaning of the parameters is as follows:
     * hf_name - Header field name to be removed.

   Example 12. remove_hf usage
...
remove_hf("Subject")  # strip all headers whose name is "Subject".
...

1.2.13.  remove_hf_re(reg_exp)

   Remove from the message all the headers whose names match a given
   regular expression.

   Meaning of the parameters is as follows:
     * reg_exp - Regular expression that is matched against header name
       fields.

   Example 13. remove_hf_re usage
...
remove_hf_re("Subject|P-.*|X-.*")  # strip all headers whose names match
"Subject", contain "P-" or "X-".
...

1.2.14.  append_hf_value(hf, xl_value)

   Append new header value after an existing header, if no index acquired
   append at the end of list. Note that a header may consist of comma
   delimited list of values.

   Meaning of the parameters is as follows:
     * hf - Header field to be appended. Format: HFNAME [ [IDX] ]. If
       index is not specified new header is inserted at the end of
       message.
     * xl_value - Value to be added, xl_lib formatting supported.

   Example 14. append_hf_value usage
...
append_hf_value("foo", "gogo;stamp=%Ts")   # add new header
append_hf_value("foo[1]", "gogo")  # add new value behind first value
append_hf_value("foo[-1]", "%@Bar") # try add value to the last header, if not e
xists add new header
...

1.2.15.  insert_hf_value(hf, xl_value)

   Insert new header value before an existing header, if no index acquired
   insert before first hf header. Note that a header may consist of comma
   delimited list of values. To insert value behing last value use
   appenf_hf_value.

   Meaning of the parameters is as follows:
     * hf - Header field to be appended. Format: HFNAME [ [IDX] ]. If
       index is not specified new header is inserted at the top of
       message.
     * xl_value - Value to be added, xl_lib formatting supported.

   Example 15. insert_hf_value usage
...
insert_hf_value("foo[2]", "gogo")
insert_hf_value("foo", "%$an_avp")   # add new header at the top of list
insert_hf_value("foo[1]", "gogo") # try add to the first header
...

1.2.16.  remove_hf_value(hf_par)

   Remove the header value from existing header, Note that a header may
   consist of comma delimited list of values.

   Meaning of the parameters is as follows:
     * hf_par - Header field/param to be removed. Format: HFNAME [ [IDX] ]
       [. PARAM ] If asterisk is specified as index then all values are
       affected.

   Example 16. remove_hf_value usage
...
remove_hf_value("foo")  # remove foo[1]
remove_hf_value("foo[*]")  # remove all foo's headers
remove_hf_value("foo[-1]") # last foo
remove_hf_value("foo.bar")  # delete parameter
remove_hf_value("foo[*].bar") # for each foo delete bar parameters
...

1.2.17.  remove_hf_value2(hf_par)

   Remove specified header or parameter. It is expected header in
   Authorization format (comma delimiters are not treated as multi-value
   delimiters).

   Meaning of the parameters is as follows:
     * hf_par - Header/param to be removed. Format: HFNAME [ [IDX] ] [.
       PARAM ] If asterisk is specified as index then all values are
       affected.

   Example 17. remove_hf_value2 usage
...
remove_hf_value2("foo")  # remove foo[1]
remove_hf_value2("foo[*]")  # remove all foo's headers, the same as remove_hf_he
ader("foo[*]");
remove_hf_value2("foo[-1]") # last foo
remove_hf_value2("foo.bar")  # delete parameter
remove_hf_value2("foo[*].bar") # for each foo delete bar parameters
...

1.2.18.  assign_hf_value(hf, xl_value)

   Assign value to specified header value / param.

   Meaning of the parameters is as follows:
     * hf_para - Header field value / param to be appended. Format: HFNAME
       [ [IDX] ] [. PARAM] If asterisk is specified as index then all
       values are affected.
     * xl_value - Value to be assigned, xl_lib formatting supported. If
       value is empty then no equal sign apears in param.

   Example 18. assign_hf_value usage
...
assign_hf_value("foo", "gogo")  # foo[1]
assign_hf_value("foo[-1]", "gogo")  # foo[last_foo]

assign_hf_value("foo.bar", "")
assign_hf_value("foo[3].bar", "")
assign_hf_value("foo[*]", "")  # remove all foo's, empty value remains
assign_hf_value("foo[*].bar", "")  # set empty value (ex. lr)
...

1.2.19.  assign_hf_value2(hf, xl_value)

   Assign value to specified header. It is expected header in
   Authorization format (comma delimiters are not treated as multi-value
   delimiters).

   Meaning of the parameters is as follows:
     * hf_para - Header field value / param to be appended. Format: HFNAME
       [ [IDX] ] [. PARAM] If asterisk is specified as index then all
       values are affected.
     * xl_value - Value to be assigned, xl_lib formatting supported. If
       value is empty then no equal sign apears in param.

   Example 19. assign_hf_value2 usage
...
assign_hf_value2("Authorization.integrity-protected", "\"yes\"")
assign_hf_value2("foo[-1]", "gogo")  # foo[last_foo]
assign_hf_value2("foo[*].bar", "")  # set empty value (ex. lr)
...

1.2.20.  include_hf_value(hf, xl_value)

   Add value in set if not exists, eg. "Supported: path,100rel".

   Meaning of the parameters is as follows:
     * hf - Header field name to be affected.
     * value - xl_lib formatting supported.

   Example 20. include_hf_value usage
...
include_hf_value("Supported", "path");
...

1.2.21.  exclude_hf_value(hf, xl_value)

   Remove value from set if exists, eg. "Supported: path,100rel".

   Meaning of the parameters is as follows:
     * hf - Header field name to be affected.
     * value - xl_lib formatting supported.

   Example 21. exclude_hf_value usage
...
exclude_hf_value("Supported", "100rel");
...

1.2.22.  hf_value_exists(hf, xl_value)

   Check if value exists in set. Alternate select
   @hf_value_exists.HF.VALUE may be used. It returns one or zero.

   Meaning of the parameters is as follows:
     * hf - Header field name to be affected. Underscores are treated as
       dashes.
     * value - xl_lib formatting supported.

   Example 22. hf_value_exists usage
...
if (hf_value_exists("Supported", "100rel")) {

}

if (@hf_value_exists.supported.path == "1") {

}
...

1.2.23.  @hf_value selects

   Get value of required header-value or param. Note that functions called
   'value2' works with Authorization-like headers where comma is not
   treated as value delimiter. Formats: @hf_value.HFNAME[IDX] # idx value,
   negative value counts from bottom @hf_value.HFNAME.PARAM_NAME
   @hf_value.HFNAME[IDX].PARAM_NAME @hf_value.HFNAME.p.PARAM_NAME # or
   .param., useful if requred called "uri", "p", "param"
   @hf_value.HFNAME[IDX].p.PARAM_NAME # dtto @hf_value.HFNAME[IDX].uri #
   (< & > excluded) @hf_value.HFNAME[*] # return comma delimited list of
   all values (combines headers) @hf_value.HFNAME # the same as above [*]
   but may be parsed by cfg.y @hf_value.HFNAME[*].uri # return comma
   delimited list of uris (< & > excluded) @hf_value.HFNAME.uri # the same
   as above [*] but may be parsed by cfg.y @hf_value.HFNAME[IDX].name #
   returns name part, quotes excluded @hf_value.HFNAME.name # returns name
   part of the first value @hf_value2.HFNAME # returns value of first
   header @hf_value2.HFNAME[IDX] # returns value of idx's header
   @hf_value2.HFNAME.PARAM_NAME @hf_value2.HFNAME[IDX].PARAM_NAME
   @hf_value.HFNAME[IDX].uri # return URI, quotes excluded
   @hf_value.HFNAME.p.uri # returns param named uri, not URI itself
   @hf_value.HFNAME.p.name # returns param named name, not name itself
   @hf_value.HFNAME[IDX].uri.name # any sel_any_uri nested features may be
   used @hf_value.HFNAME[IDX].nameaddr.name # select_any_nameaddr

   Meaning of the parameters is as follows:
     * HFNAME - Header field name. Underscores are treated as dashes.
     * IDX - Value index, negative value counts from bottom
     * PARAM_NAME - name of parameter

   Example 23. @hf_value select usage
...
$a = @hf_value.my_header[1].my_param;
xplog("L_ERR", "%@hf_value.via[-1], %@hf_value.from.tag\n");
$b = @hf_value.p_associated_uri;

xplog("L_ERR", "Route uris: '%@hf_value.route[*].uri'\n");
$rr = @hf_value.route.uri;

$prt = @hf_value2.authorization.integrity_protected;
...