<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Yes, if a reply route is armed or the global reply route exists, they are triggered first for any reply. Failure route, if armed, is triggered after that for any >=300 response codes.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="color:black">Ben Newlin </span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">Users <users-bounces@lists.opensips.org> on behalf of David Villasmil <david.villasmil.work@gmail.com><br>
<b>Date: </b>Thursday, June 3, 2021 at 8:10 AM<br>
<b>To: </b>OpenSIPS users mailling list <users@lists.opensips.org><br>
<b>Subject: </b>Re: [OpenSIPS-Users] Getting header from 302<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal">Oh I didn’t register that <reply> param. I’ll try with that.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">On the other hand, I may be confused about how opensips processes >299 replies. Does it process them on onreply route and then goes to the failure route? I mean that’s what I’m doing right now, but is this intended by design? I would’ve
 though it’d go straight to the failure route, but actually going to the onreply route sounds smart.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Wed, 2 Jun 2021 at 22:08, Jeff Pyle <<a href="mailto:jeff@ugnd.org">jeff@ugnd.org</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal">I've been working on a proxy to sit between MS Teams and "normal" SIP stacks.  Teams sends way too many 180s and RTP-less 183s so I sanitize them like this:<br>
<br>
<span style="font-family:"Courier New"">onreply_route[relay_reply] {<br>
        if (t_check_status("180")) {<br>
                if (isflagset("GOT_180")) {<br>
                        drop;<br>
                } else {<br>
                        setflag("GOT_180");<br>
                }<br>
        }<br>
<br>
        if (isflagset("GOT_180") && t_check_status("183")) {<br>
                drop;<br>
        }</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">With this I stop superfluous 18x messages from being relayed downstream.  The 'drop' here kills the message completely.  You could include the drop if you want to stop the message from being relayed (which you probably do) and are finished
 processing it in the script (which you are probably not).<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">If I understand your application correctly, I'd populate the AVP in the reply route and do everything else in the failure route.  Or, try Liviu's suggestion of using $(<reply>hdr(Identity)) in the failure_route directly.  Either way, then
 continue in the failure_route to do whatever else needs to happen.<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">- Jeff<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Wed, Jun 2, 2021 at 2:10 PM David Villasmil <<a href="mailto:david.villasmil.work@gmail.com" target="_blank">david.villasmil.work@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">Hello Jeff,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">That's exactly what I'm doing:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""># Relay to REDIRECT server<br>
route[relay_to_REDIRECT]<br>
{<br>
    t_on_reply("reply_from_REDIRECT");<br>
    t_on_failure("failure_from_REDIRECT");<br>
<br>
    xlog("L_ERR", "[$ci][$rm]: Relaying to REDIRECT");<br>
    if (!t_relay()) {<br>
        xlog("L_ERR", "[$ci][$rm]: unable to relay request $ru to $tU -- replying with error");<br>
        sl_reply_error();<br>
    }<br>
<br>
    exit;<br>
}<br>
<br>
# Response from REDIRECT will come in here.<br>
failure_route[failure_from_REDIRECT]<br>
{<br>
    xlog("L_ERR", "[$ci][$rm]: I'm in failure_route[failover_from_REDIRECT]");<br>
    if (t_was_cancelled()) {<br>
        exit;<br>
    }<br>
<br>
    if(is_avp_set("$avp(myheader)")) {<br>
        xlog("L_ERR", "[$ci][$rm]: Got Identity Header: $(hdr(myheader))");<br>
        setflag(100);<br>
        route(invite);<br>
    }<br>
}<br>
<br>
# Response 302 from REDIRECT will come in here.<br>
onreply_route[reply_from_REDIRECT]<br>
{<br>
    xlog("L_ERR", "[$ci][$rm]: I'm in onreply_route[reply_from_REDIRECT]");<br>
    if (t_was_cancelled()) {<br>
        exit;<br>
    }<br>
<br>
    # detect redirect, store the header and send to "invite" as normally<br>
    if (t_check_status("302") && is_present_hf("myheader")) {<br>
        $avp(identity_header) = $(hdr(myheader));<br>
        setflag(100);<br>
        drop();<br>
    }<br>
}</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">So I suppose i don't need the drop()?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">David Villasmil<o:p></o:p></p>
<div>
<p class="MsoNormal">email: <a href="mailto:david.villasmil.work@gmail.com" target="_blank">
david.villasmil.work@gmail.com</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">phone: +34669448337<o:p></o:p></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
</div>
</body>
</html>