Would be nicer not to forward all headers inline, that results in a message easy to read (especially on mobile devices) and therefore faster to answer.

You use subst over contact and set contact allias, which both append values there, deleting same old content. Note that any change to sip message is not applied immediately, but kept as a diff operation. You need to use msg_apply_changes() after each change that you need to be visible immediately -- read the readme of textopsx for proper usage of this function.

Cheers,
Daniel

On 12/08/14 17:22, Alex Villací­s Lasso wrote:



-------- Mensaje original --------
Return-Path: <sr-users-bounces@lists.sip-router.org>
Delivered-To: <a_villacis@palosanto.com>
Received: from palosanto.com by mail.palosanto.com (Dovecot) with LMTP id o9JTLusS6VNAYAAA3RMWGw for <a_villacis@palosanto.com>; Mon, 11 Aug 2014 14:02:20 -0500
Received: from localhost (mail.palosanto.com [127.0.0.1]) by palosanto.com (Postfix) with ESMTP id DB61213C026F for <a_villacis@palosanto.com>; Mon, 11 Aug 2014 14:02:20 -0500 (ECT)
X-Virus-Scanned: Debian amavisd-new at mail.palosanto.com
X-Spam-Flag: NO
X-Spam-Score: -2.159
X-Spam-Level:
X-Spam-Status: No, score=-2.159 tagged_above=-1000 required=6.31 tests=[AWL=-0.259, BAYES_00=-1.9] autolearn=ham
Received: from palosanto.com ([127.0.0.1]) by localhost (mail.palosanto.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id i5aRnN4kNPTq for <a_villacis@palosanto.com>; Mon, 11 Aug 2014 14:02:17 -0500 (ECT)
Received: from www.kamailio.org (main.kamailio.org [193.22.119.66]) by palosanto.com (Postfix) with ESMTPS id AAB2813C0276 for <a_villacis@palosanto.com>; Mon, 11 Aug 2014 14:02:16 -0500 (ECT)
Received: from localhost ([127.0.0.1] helo=main.kamailio.org ident=list) by www.kamailio.org with esmtp (Exim 4.72) (envelope-from <sr-users-bounces@lists.sip-router.org>) id 1XGurq-00065q-JJ; Mon, 11 Aug 2014 21:02:50 +0200
Received: from lab2.palosanto.com ([201.234.196.173] helo=palosanto.com) by www.kamailio.org with esmtp (Exim 4.72) (envelope-from <a_villacis@palosanto.com>) id 1XGuro-000654-FM for sr-users@lists.sip-router.org; Mon, 11 Aug 2014 21:02:48 +0200
Received: from localhost (mail.palosanto.com [127.0.0.1]) by palosanto.com (Postfix) with ESMTP id D745713C026F for <sr-users@lists.sip-router.org>; Mon, 11 Aug 2014 14:02:04 -0500 (ECT)
X-Virus-Scanned: Debian amavisd-new at mail.palosanto.com
Received: from palosanto.com ([127.0.0.1]) by localhost (mail.palosanto.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6B6_a4ssmARw for <sr-users@lists.sip-router.org>; Mon, 11 Aug 2014 14:02:02 -0500 (ECT)
Received: from avillacis.palosanto.com (avillacis.palosanto.com [192.168.3.2]) by palosanto.com (Postfix) with ESMTPSA id 8EBDA13C0286 for <sr-users@lists.sip-router.org>; Mon, 11 Aug 2014 14:01:33 -0500 (ECT)
Message-ID: <53E91331.50104@palosanto.com>
Date: Mon, 11 Aug 2014 14:02:09 -0500
From: Alex Villací­s Lasso <a_villacis@palosanto.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.7.0
MIME-Version: 1.0
To: sr-users@lists.sip-router.org
References: <53E54348.9090904@palosanto.com> <53E8712A.2050407@gmail.com>
In-Reply-To: <53E8712A.2050407@gmail.com>
Subject: Re: [SR-Users] How do I make subst_hf() use variables in search (not replacement)?
X-BeenThere: sr-users@lists.sip-router.org
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: Kamailio (SER) - Users Mailing List <sr-users@lists.sip-router.org>
List-Id: "Kamailio \(SER\) - Users Mailing List" <sr-users.lists.sip-router.org>
List-Unsubscribe: <http://lists.sip-router.org/cgi-bin/mailman/options/sr-users>, <mailto:sr-users-request@lists.sip-router.org?subject=unsubscribe>
List-Archive: <http://lists.sip-router.org/pipermail/sr-users>
List-Post: <mailto:sr-users@lists.sip-router.org>
List-Help: <mailto:sr-users-request@lists.sip-router.org?subject=help>
List-Subscribe: <http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users>, <mailto:sr-users-request@lists.sip-router.org?subject=subscribe>
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="windows-1252"; Format="flowed"
Sender: sr-users-bounces@lists.sip-router.org
Errors-To: sr-users-bounces@lists.sip-router.org


El 11/08/14 02:30, Daniel-Constantin Mierla escribió:
> I haven't looked at the code, but probably the function doesn't accept variable for the matching regular expression.
>
> If the IP/port of asterisk are not changed, you can try:
>
> #!substdef "/ASTERISKIP/127.0.0.1/"
> #!substdef "/ASTERISKPORT/5080/"
>
> asterisk.bindip = "ASTERISKIP" ...
> asterisk.bindport = ASTERISKPORT ...
>
> subst_hf("Contact", "/ASTERISKIP:ASTERISKPORT/$td/", "a");
>
> Cheers,
> Daniel
>
> On 08/08/14 23:38, Alex Villací­s Lasso wrote:
>> Consider the following snippet:
>>
>> if (is_present_hf("Contact")) {
>>         xlog("L_ALERT", "===== reply to SUBSCRIBE has Contact:$ct\n");
>>         xlog("L_ALERT", "===== want to replace with $td\n");
>>         xlog("L_ALERT", "===== regexp to use is /$sel(cfg_get.asterisk.bindip):$sel(cfg_get.asterisk.bindport)/$td/\n");
>>         if (subst_hf("Contact", "/127.0.0.1:5080/$td/", "a")) {
>>                 xlog("L_ALERT", "===== reply had Contact modified\n");
>>         }
>> }
>>
>> If I use the hardcoded regexp "/127.0.0.1:5080/$td/", subst_hf() replaces the Contact value correctly.
>>
>> However, if I use "/$sel(cfg_get.asterisk.bindip):$sel(cfg_get.asterisk.bindport)/$td/" (where asterisk.bindip and asterisk.bindport are the supposed values 127.0.0.1 and 5080), subst_hf() fails to replace the Contact value.
>>
>> How do I make use of the existing configuration variables in order to substitute in the Contact header?
>>
>> _______________________________________________
>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>> sr-users@lists.sip-router.org
>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>
Thanks for the tip.

However, I also have an issue - subst_hf() does not seem to be working. Consider the following route, of which the snippet quoted above is a part:

# manage incoming replies
onreply_route[MANAGE_REPLY] {
        # run rtpproxy resolution
        route(MHOMED_ELASTIX);

        xdbg("incoming reply\n");
        if(status=~"[12][0-9][0-9]")
                route(NATMANAGE);

        if (is_method("SUBSCRIBE") && route(FROMASTERISK)) {
                #xlog("L_ALERT", "===== reply to SUBSCRIBE, coming from asterisk, Call-ID is $ci\n");
                $sht(pending_subscribe=>$ci) = 0;

                if (is_present_hf("Contact")) {
                        xlog("L_ALERT", "===== reply to SUBSCRIBE has Contact: $ct\n");
                        xlog("L_ALERT", "===== want to replace with $td\n");
                        xlog("L_ALERT", "===== regexp to use is /$sel(cfg_get.asterisk.bindip):$sel(cfg_get.asterisk.bindport)/$td/\n");
                        if (subst_hf("Contact", "/127.0.0.1:5080/$td/", "a")) {
                                xlog("L_ALERT", "===== reply hadContact modified\n");
                        }
                }
        }

        # manage websocket reply
        if (nat_uac_test(64)) {
                # Do NAT traversal stuff for replies to a WebSocket connection
                # - even if it is not behind a NAT!
                # This won't be needed in the future if Kamailio and the
                # WebSocket client support Outbound and Path.
                add_contact_alias();
        }
}


When I run this with debug=4, I get the following:

Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [socket_info.c:583]: grep_sock_info(): grep_sock_info - checking if host==us: 9==9 && [127.0.0.1] == [127.0.0.1]
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [dset.c:769]: uri_add_rcv_alias(): encoded <sip:102@127.0.0.1:5080> => [sip:102@127.0.0.1:5080;alias=127.0.0.1~5080~1
]
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [select.c:429]: run_select(): Calling SELECT 0x7f8e431a3d90
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [select.c:429]: run_select(): Calling SELECT 0x7f8e43292ac0
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: htable [ht_var.c:90]:pv_set_ht_cell(): set value for $ht(pending_subscribe=>6a2222bca4cc2be8)
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: ALERT: <script>: ===== reply to SUBSCRIBE has Contact: <sip:102@127.0.0.1:5080>;expires=3600
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: ALERT: <script>: ===== want to replace with pbx.villacis.com
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [select.c:429]: run_select(): Calling SELECT 0x7f8e431a3d90
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [select.c:429]: run_select(): Calling SELECT 0x7f8e43292ac0
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: ALERT: <script>: ===== regexp to use is /127.0.0.1:5080/pbx.villacis.com/
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [re.c:454]: subst_run(): subst_run: running. r=0
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [re.c:475]: subst_run(): subst_run: matched (9, 14): [127.0.0.1:5080]
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: textops [textops.c:2285]: subst_hf_f(): textops replacing at offset 849 [127.0.0.1:5080] with [pbx.villacis.com]
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: textops [textops.c:2351]: subst_hf_f(): lst was 0x7f8e432e4918
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: ALERT: <script>: ===== reply had Contact modified
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: tm [t_reply.c:1304]: t_should_relay_response(): ->>>>>>>>> T_code=0, new_code=200
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: tm [t_reply.c:1822]: relay_reply(): DEBUG: relay_reply: branch=0, save=0, relay=0 icode=0
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [msg_translator.c:2009]: generate_res_buf_from_sip_res():  old size: 900, new size: 813
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [msg_translator.c:2027]: generate_res_buf_from_sip_res(): copied size: orig:863, new: 776, rest: 37 msg=#012SIP/2.0 200 OK#015#012Via: SIP/2.0/UDP 
192.168.2.100:5060;rport=5060;branch=z9hG4bK036380ac70257f0f5#015#012Record-Route: <sip:127.0.0.1;r2=on;lr=on;ftag=239adbead7;vsf=cBoZSlANEgEdDBcAFx8lMBIaVlgfBQANAgoaXU0MAi0xMjcuMC4wLjE6NTA4MA--;nat=yes>#015#012Record-Route: 
<sip:192.168.2.18;r2=on;lr=on;ftag=239adbead7;vsf=cBoZSlANEgEdDBcAFx8lMBIaVlgfBQANAgoaXU0MAi0xMjcuMC4wLjE6NTA4MA--;nat=yes>#015#012From: "jgutierrez" <sip:jgutierrez@pbx.villacis.com>;tag=239adbead7#015#012To: "" 
<sip:102@pbx.villacis.com>;tag=as2e48d5d6#015#012Call-ID: 6a2222bca4cc2be8#015#012CSeq: 22329 SUBSCRIBE#015#012Server: Asterisk PBX 11.11.0#015#012Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE#015#012Supported: 
replaces, timer#015#012Expires: 3600#015#012Contact: <sip:102@127.0.0.1:5080;alias=127.0.0.1~5080~1pbx.villacis.com>;expires=3600#015#012Content-Length: 0#015#012#015#012
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [mem/shm_mem.c:111]: _shm_resize(): WARNING:vqm_resize: resize(0) called
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: tm [t_reply.c:1663]: cleanup_uac_timers(): DEBUG: cleanup_uac_timers: RETR/FR timers reset
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [usr_avp.c:644]: destroy_avp_list(): DEBUG:destroy_avp_list: destroying list (nil)
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [usr_avp.c:644]: destroy_avp_list(): DEBUG:destroy_avp_list: destroying list (nil)
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [usr_avp.c:644]: destroy_avp_list(): DEBUG:destroy_avp_list: destroying list (nil)
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [usr_avp.c:644]: destroy_avp_list(): DEBUG:destroy_avp_list: destroying list (nil)
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [usr_avp.c:644]: destroy_avp_list(): DEBUG:destroy_avp_list: destroying list (nil)
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [usr_avp.c:644]: destroy_avp_list(): DEBUG:destroy_avp_list: destroying list (nil)
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [xavp.c:448]: xavp_destroy_list(): destroying xavp list (nil)
Aug 11 12:52:53 elx3 /usr/sbin/kamailio[2971]: DEBUG: <core> [receive.c:296]: receive_msg(): receive_msg: cleaning up

Apparently the search matched, and the replace was made. However, the replacement is incorrect:

Contact: <sip:102@127.0.0.1:5080;alias=127.0.0.1~5080~1pbx.villacis.com>;expires=3600

What I going on? Is the regexp incorrect? What I expected for the Contact header is this:

Contact: <sip:102@pbx.villacis.com>;expires=3600
or this:
Contact: <sip:102@pbx.villacis.com;alias=127.0.0.1~5080~1>;expires=3600

...although I am not sure whether the latter is a valid header, but at least it would do something expected.

The documentation (http://www.kamailio.org/docs/modules/4.1.x/modules/textops.html#idp1655472) says the regexp is perl-style, and a sample running with perl shows the regexp to work correctly and to do what I want. I made a mistake when I mentioned that subst_hf() works correctly with the hardcoded regexp. What was really happening is that it does get accepted as a valid configuration, but displays unexpected behavior.

_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users




_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users

-- 
Daniel-Constantin Mierla
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
Next Kamailio Advanced Trainings 2014 - http://www.asipto.com
Sep 22-25, Berlin, Germany ::: Oct 15-17, San Francisco, USA