name mode size
..
doc 040000
Makefile 100644 244B
README 100644 13.86kB
textops.c 100644 60.13kB
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; ...