<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">It looks like the {uri.param,tgrp} transforms do not look at Parameters before the host.  I will have to go back to the Regex.</div><div dir="ltr"><br></div><div dir="ltr">sip:1234567890;tgrp=1098765432;trunk-context=<a href="http://mydomain.com@10.10.10.10:5060/" target="_blank">mydomain.com@10.10.10.10:5060</a> </div><div dir="ltr"><br></div><div>The working scenario</div><div><br></div><div>modparam("dispatcher", "hash_pvar", "$avp(contacthash)")<br></div><div><br></div><div><div>        if (is_method("REGISTER|INVITE")) {</div><div>                $avp(contacturi) = $ct.fields(uri);</div><div>                $avp(str) = "tgrp="; </div><div>                $avp(str2) = "/sip:*.*;tgrp/tgrp/g";</div><div>                if ($(avp(contacturi){s.index, $avp(str)}) != NULL){</div><div>                        xlog("found $avp(str) in $avp(contacturi)\n");</div><div>                        $avp(contacthash) = $(avp(contacturi){re.subst,$avp(str2)});</div><div>                        xlog("Contact Hash should be $avp(contacthash)\n");</div><div>                }</div><div>                else {</div><div>                        xlog("did not find $avp(str) in $avp(contacturi)\n");</div><div>                        $avp(contacthash) = $(avp(contacturi));</div><div>                        }</div></div><div>                ds_select_dst(1, 7, , "default", 1);<br></div><div><br></div><div>The issue I am trying to run down now is the 200 OK Contact sent to the user as I would like to keep the opensips server Stateful</div><div><br></div><div>Thank you.</div><div><br></div><div>Kevin</div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 8, 2022 at 8:18 AM Kevin Kennedy <<a href="mailto:kennedy4260@gmail.com">kennedy4260@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Thank you for the response.  I did get the other way to work last night with a slight modification to the regex <b>$var(str2) = "/sip:*.*;tgrp/tgrp/g";</b> had to add an extra <b>.*</b> after the first <b>*</b>, as it wasn't matching the regex expression, causing the issue.  However your method looks a lot cleaner.  I will give that a try.  </div><div dir="ltr"><br></div><div>The issue I am having now is that the Contact in the 200 OK when sending back to the phone is sending the SBC IP that is in the dispatcher.  How do I keep the replies stateful?  I was looking at the topology_hiding module, but that looks to be overkill.  Is there an easier way to do this?</div><div><br></div><div>Thank you.</div><div><br></div><div>Kevin</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 8, 2022 at 2:57 AM Răzvan Crainea <<a href="mailto:razvan@opensips.org" target="_blank">razvan@opensips.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi, Kevin!<br>
<br>
It would be simpler if you would have used the uri transformations:<br>
<a href="https://www.opensips.org/Documentation/Script-Tran-3-2#toc32" rel="noreferrer" target="_blank">https://www.opensips.org/Documentation/Script-Tran-3-2#toc32</a><br>
<br>
Simply grab the URI and do something like:<br>
<br>
if ($(var(contacturi){uri.param,tgrp}) != NULL) {<br>
     $var(contacthash) = $(var(contacturi){uri.params});<br>
} else {<br>
     $var(contacthash) = $(var(contacturi));<br>
}<br>
<br>
Răzvan Crainea<br>
OpenSIPS Core Developer<br>
<a href="http://www.opensips-solutions.com" rel="noreferrer" target="_blank">http://www.opensips-solutions.com</a><br>
<br>
On 11/5/22 16:55, Kevin Kennedy wrote:<br>
> I am trying to find a way to use the pvar_hash in the Dispatcher module <br>
> to hash on the Contact URI.  Normally this can be done with using <br>
> $ct.fields(uri) to hash on and this does work,<br>
> <br>
> The caveat that I have is that I am using RFC4904 (SIP Connect) with <br>
> some customers and other customers have a normal Contact URI.<br>
> <br>
> RFC4904<br>
> sip:1234567890;tgrp=1098765432;trunk-context=<a href="http://mydomain.com@10.10.10.10:5060" rel="noreferrer" target="_blank">mydomain.com@10.10.10.10:5060</a> <<a href="http://mydomain.com@10.10.10.10:5060" rel="noreferrer" target="_blank">http://mydomain.com@10.10.10.10:5060</a>><br>
> <br>
> Normal<br>
> <a href="http://sip:1234567890@10.10.10.10:5060" rel="noreferrer" target="_blank">sip:1234567890@10.10.10.10:5060</a> <<a href="http://sip:1234567890@10.10.10.10:5060" rel="noreferrer" target="_blank">http://sip:1234567890@10.10.10.10:5060</a>><br>
> <br>
> I am looking for a way to be able to identify if the Contact URI has the <br>
> TGRP parameter, and if it does build the hash with the SIP URI starting <br>
> at the tgrp, ie<br>
> tgrp=1098765432;trunk-context=<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">mydomain.com@192.168.1.122:5076</a> <br>
> <<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">http://mydomain.com@192.168.1.122:5076</a>><br>
> <br>
> If it doesn't have the TGRP parameter, build the hash with the full contact.<br>
> <br>
> I tried with this logic<br>
> <br>
> modparam("dispatcher", "hash_pvar", "$var(contacthash)")<br>
> <br>
>          if (is_method("REGISTER|INVITE")) {<br>
>                  $var(contacturi) = $ct.fields(uri);<br>
>                  $var(str) = "tgrp=";<br>
>                  $var(str2) = "/sip:*;tgrp/tgrp/g";<br>
>                  if ($(var(contacturi){s.index, $var(str)}) != NULL){<br>
>                          xlog("found $var(str) in $var(contacturi)\n");<br>
>                          <br>
> $var(contacthash)=$(var(contacturi){re.subst,$var(str2)});<br>
>                  }<br>
>                  else {<br>
>                          xlog("did not find $var(str) in <br>
> $var(contacturi)\n");<br>
>                          $var(contacthash) = $(var(contacturi));<br>
>                  }<br>
>                  ds_select_dst(3, 7, , "default", 1);<br>
>                   t_relay()<br>
>                  exit<br>
>             }<br>
> <br>
> I am seeing that the hash is still being created on the full Contact<br>
> <br>
> DBG:core:parse_headers: flags=ffffffffffffffff<br>
> found tgrp= in <br>
> sip:1234567890;tgrp=1098765432;trunk-context=<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">mydomain.com@192.168.1.122:5076</a> <<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">http://mydomain.com@192.168.1.122:5076</a>><br>
> DBG:core:tr_eval_re: Trying to apply regexp [/sip:*;tgrp/tgrp/g] on : <br>
> [sip:1234567890;tgrp=1098765432;trunk-context=<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">mydomain.com@192.168.1.122:5076</a> <<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">http://mydomain.com@192.168.1.122:5076</a>>]<br>
> DBG:core:tr_eval_re: yay, we can use the pre-compile regexp<br>
> DBG:core:subst_run: running. r=1<br>
> DBG:core:subst_str: no match<br>
> DBG:core:tr_eval_re: no match for subst expression<br>
> DBG:core:grep_sock_info_ext: checking if host==us: 14==14 &&  <br>
> [10.255.100.241] == [10.255.100.240]<br>
> DBG:core:grep_sock_info_ext: checking if port 5060 matches port 5060<br>
> DBG:core:grep_sock_info_ext: checking if host==us: 14==14 &&  <br>
> [10.255.100.241] == [10.255.100.241]<br>
> DBG:core:grep_sock_info_ext: checking if port 5060 matches port 5060<br>
> DBG:core:comp_scriptvar: str 20: <a href="http://mydomain.com" rel="noreferrer" target="_blank">mydomain.com</a> <<a href="http://mydomain.com" rel="noreferrer" target="_blank">http://mydomain.com</a>><br>
> DBG:dispatcher:w_ds_select: ds_select: 3 7 1 1<br>
> DBG:dispatcher:ds_select_dst: set [3], using alg [7], size [3], used <br>
> size [2], active size [3]<br>
> *DBG:dispatcher:ds_hash_pvar: Hashing <br>
> sip:1234567890;tgrp=1098765432;trunk-context=<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">mydomain.com@192.168.1.122:5076</a> <<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">http://mydomain.com@192.168.1.122:5076</a>>!*<br>
> DBG:dispatcher:ds_select_dst: hash [1435049604], candidate [-1], weight <br>
> sum [20]<br>
> DBG:dispatcher:ds_select_dst: candidate is [0]<br>
> DBG:dispatcher:ds_select_dst: using destination [0]<br>
> DBG:dispatcher:ds_select_dst: selected [7-3/0] <sip:<a href="http://sbc1.sbcdomain.com" rel="noreferrer" target="_blank">sbc1.sbcdomain.com</a> <br>
> <<a href="http://sbc1.sbcdomain.com" rel="noreferrer" target="_blank">http://sbc1.sbcdomain.com</a>>><br>
> <br>
> I am expecting to see the hash as <br>
> *tgrp=1098765432;trunk-context=<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">mydomain.com@192.168.1.122:5076</a> <br>
> <<a href="http://mydomain.com@192.168.1.122:5076" rel="noreferrer" target="_blank">http://mydomain.com@192.168.1.122:5076</a>>!*<br>
> that way it matches no matter what number is sent in the User field.<br>
> <br>
> Thank you.<br>
> <br>
> Kevin<br>
> <br>
> _______________________________________________<br>
> Users mailing list<br>
> <a href="mailto:Users@lists.opensips.org" target="_blank">Users@lists.opensips.org</a><br>
> <a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a><br>
<br>
_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.opensips.org" target="_blank">Users@lists.opensips.org</a><br>
<a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a><br>
</blockquote></div>
</blockquote></div>