<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=us-ascii">
<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;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0cm;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        mso-fareast-language:EN-US;}
span.EmailStyle21
        {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:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">After extensive testing and trawling endless debug logs the resolution I came to was the below. Any feedback would be welcome, this is in early stages as mentioned so sure lots of tweaks along the way.
<br>
<br>
As we only need the response from the API and no data is passed back (at this stage) I set it to send a stateless response to the subscriber and cleanup with a t_release.
<br>
<br>
def ksr_route_api_query(self, msg):<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        KSR.tm.t_newtran()<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        async def main():<o:p></o:p></p>
<p class="MsoNormal">            url = '<a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapi.hidingtheurl.com%2Fsubscribe&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434568697%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=mUs5HI9I3DPonJHWvPv4Yl%2FEvzoQuD%2FSA1TJWawYJ0E%3D&reserved=0">https://api.hidingtheurl.com/subscribe</a>’<o:p></o:p></p>
<p class="MsoNormal">            payload = {<o:p></o:p></p>
<p class="MsoNormal">                "ruri": KSR.pv.get("$ru"),<o:p></o:p></p>
<p class="MsoNormal">                "from": KSR.pv.get("$fu"),<o:p></o:p></p>
<p class="MsoNormal">                "from_tag": KSR.pv.gete("$ft"),<o:p></o:p></p>
<p class="MsoNormal">                "to": KSR.pv.get("$tu"),<o:p></o:p></p>
<p class="MsoNormal">                "callid": KSR.pv.get("$ci"),<o:p></o:p></p>
<p class="MsoNormal">                "cseq": KSR.pv.get("$cs"),<o:p></o:p></p>
<p class="MsoNormal">                "contact" : KSR.pv.gete("$ct"),<o:p></o:p></p>
<p class="MsoNormal">                "supported": KSR.pv.get("$hdr(Supported)"),<o:p></o:p></p>
<p class="MsoNormal">                "event": KSR.pv.get("$hdr(Event)"),<o:p></o:p></p>
<p class="MsoNormal">                "expires": KSR.pv.get("$hdr(Expires)"),<o:p></o:p></p>
<p class="MsoNormal">                "diversion": KSR.pv.get("$di"),<o:p></o:p></p>
<p class="MsoNormal">                "body": KSR.pv.get("$rb")<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">            async with aiohttp.ClientSession() as session:<o:p></o:p></p>
<p class="MsoNormal">                async with session.post(url, json=payload) as response:<o:p></o:p></p>
<p class="MsoNormal">                    if response.status == 0:<o:p></o:p></p>
<p class="MsoNormal">                        KSR.xlog.xinfo(f"SUB Manager Timeout: {response.status}")<o:p></o:p></p>
<p class="MsoNormal">                        KSR.sl.sl_send_reply(408, "SUB Manager Timeout")<o:p></o:p></p>
<p class="MsoNormal">                    elif response.status >= 500:<o:p></o:p></p>
<p class="MsoNormal">                          KSR.xlog.xinfo(f"SUB Manager Down: {response.status}")<o:p></o:p></p>
<p class="MsoNormal">                          KSR.sl.sl_send_reply(500, "SUB Manager Down")<o:p></o:p></p>
<p class="MsoNormal">                    elif response.status >= 400:<o:p></o:p></p>
<p class="MsoNormal">                          KSR.xlog.xinfo(f"SUB Manager Error: {response.status}")<o:p></o:p></p>
<p class="MsoNormal">                          KSR.sl.sl_send_reply(400, "SUB Manager Error")<o:p></o:p></p>
<p class="MsoNormal">                    else:<o:p></o:p></p>
<p class="MsoNormal">                        if response.status == 200:<o:p></o:p></p>
<p class="MsoNormal">                            KSR.xlog.xinfo(f"SUB Manager Success: {response.status}")<o:p></o:p></p>
<p class="MsoNormal">                            KSR.sl.sl_send_reply(200, "OK")<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        KSR.tm.t_release()<o:p></o:p></p>
<p class="MsoNormal">        asyncio.run(main())<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black;mso-fareast-language:EN-GB">Lewis
</span></b><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="mso-fareast-language:EN-GB">From:</span></b><span lang="EN-US" style="mso-fareast-language:EN-GB"> Daniel-Constantin Mierla <miconda@gmail.com>
<br>
<b>Sent:</b> 27 January 2022 10:04<br>
<b>To:</b> Kamailio (SER) - Users Mailing List <sr-users@lists.kamailio.org>; Lewis Hutchinson <lewis.hutchinson@missionlabs.co.uk><br>
<b>Subject:</b> Re: [SR-Users] 200 OK re transmission only on re-SUBSCRIBE<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p>Hello,<o:p></o:p></p>
<p>you have to look at your routing script and see if it is missing some return or exit to stop processing when the reply is sent out.<o:p></o:p></p>
<p>Cheers,<br>
Daniel<o:p></o:p></p>
<div>
<p class="MsoNormal">On 26.01.22 18:22, Lewis Hutchinson wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Hi Daniel<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<div>
<p>Many thanks, this is in the early stages and to undergo extensive testing which I suspect will see a lot efforts to improve and refine. This was previously written in native kamailio but for other reasons moved to python. Any feedback always welcome<br>
<br>
“looks like after sending the response execution continues somewhere else hitting t_check_trans() which detect the transaction exists and re-sends the last last reply (as it is supposed to behave).” can you think why this only occur on a re SUBSCRIBE<o:p></o:p></p>
<p><span style="font-size:10.5pt">There is no intelligence in the reply needed just an accurate response from the API transformed into a reply 200, 500 etc etc</span><o:p></o:p></p>
<p><br>
<br>
<b><span style="font-size:12.0pt;color:black">Lewis </span></b><o:p></o:p></p>
</div>
<p class="MsoNormal"> <o:p></o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="mso-fareast-language:EN-GB">From:</span></b><span lang="EN-US" style="mso-fareast-language:EN-GB"> Daniel-Constantin Mierla
</span><a href="mailto:miconda@gmail.com"><span lang="EN-US" style="mso-fareast-language:EN-GB"><miconda@gmail.com></span></a><span lang="EN-US" style="mso-fareast-language:EN-GB">
<br>
<b>Sent:</b> 26 January 2022 16:37<br>
<b>To:</b> Kamailio (SER) - Users Mailing List </span><a href="mailto:sr-users@lists.kamailio.org"><span lang="EN-US" style="mso-fareast-language:EN-GB"><sr-users@lists.kamailio.org></span></a><span lang="EN-US" style="mso-fareast-language:EN-GB">; Lewis Hutchinson
</span><a href="mailto:lewis.hutchinson@missionlabs.co.uk"><span lang="EN-US" style="mso-fareast-language:EN-GB"><lewis.hutchinson@missionlabs.co.uk></span></a><span lang="EN-US" style="mso-fareast-language:EN-GB"><br>
<b>Subject:</b> Re: [SR-Users] 200 OK re transmission only on re-SUBSCRIBE</span><o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"> <o:p></o:p></p>
<p>Hello,<o:p></o:p></p>
<p>looks like after sending the response execution continues somewhere else hitting t_check_trans() which detect the transaction exists and re-sends the last last reply (as it is supposed to behave).<o:p></o:p></p>
<p>Be also careful with async processing in python, I am not familiar with it at all, just be aware that kamailio has a multi-process design and uses per-process global variables. if you do multi-threading async processing in python, be sure you ensure consistency
 of globals and avoid races to read+change them.<o:p></o:p></p>
<p>Cheers,<br>
Daniel<o:p></o:p></p>
<div>
<p class="MsoNormal">On 26.01.22 16:53, Lewis Hutchinson wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">First of all I should start by saying this is my first post so go easy on me!! : ) and thank for everyone’s efforts to share knowledge it has been invaluable for my kamailio learning.<br>
<br>
<u>Build Details</u><br>
<br>
Version: kamailio 5.5.3 (x86_64/linux)<br>
Kamailio kemi python <br>
<br>
<u>Scenario</u><br>
<br>
Relevant config<br>
<br>
def ksr_route_api_query(self, msg):<o:p></o:p></p>
<p class="MsoNormal">        KSR.log("info", "SUBSCRIBE API Query Starts")<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">        # Create new Transaction<o:p></o:p></p>
<p class="MsoNormal">        KSR.tm.t_newtran()<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">        async def main():<o:p></o:p></p>
<p class="MsoNormal">            url = '<a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapi.hidingtheurl.com%2Fsubscribe&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434568697%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=mUs5HI9I3DPonJHWvPv4Yl%2FEvzoQuD%2FSA1TJWawYJ0E%3D&reserved=0">https://api.hidingtheurl.com/subscribe</a>'<o:p></o:p></p>
<p class="MsoNormal">            payload = {<o:p></o:p></p>
<p class="MsoNormal">                "ruri": KSR.pv.get("$ru"),<o:p></o:p></p>
<p class="MsoNormal">                "from": KSR.pv.get("$fu"),<o:p></o:p></p>
<p class="MsoNormal">                "from_tag": KSR.pv.gete("$ft"),<o:p></o:p></p>
<p class="MsoNormal">                "to": KSR.pv.get("$tu"),<o:p></o:p></p>
<p class="MsoNormal">                "callid": KSR.pv.get("$ci"),<o:p></o:p></p>
<p class="MsoNormal">                "cseq": KSR.pv.get("$cs"),<o:p></o:p></p>
<p class="MsoNormal">                "contact": KSR.pv.gete("$ct"),<o:p></o:p></p>
<p class="MsoNormal">                "supported": KSR.pv.get("$hdr(Supported)"),<o:p></o:p></p>
<p class="MsoNormal">                "event": KSR.pv.get("$hdr(Event)"),<o:p></o:p></p>
<p class="MsoNormal">                "expires": KSR.pv.get("$hdr(Expires)"),<o:p></o:p></p>
<p class="MsoNormal">                "diversion": KSR.pv.get("$di"),<o:p></o:p></p>
<p class="MsoNormal">                "body": KSR.pv.get("$rb")<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">            async with aiohttp.ClientSession() as session:<o:p></o:p></p>
<p class="MsoNormal">                async with session.post(url, json=payload) as response:<o:p></o:p></p>
<p class="MsoNormal">                    if response.status == 0:<o:p></o:p></p>
<p class="MsoNormal">                        KSR.xlog.xinfo(f"SUB Manager Timeout: {response.status}")<o:p></o:p></p>
<p class="MsoNormal">                        KSR.tm.t_reply(408, "SUB Manager Timeout")<o:p></o:p></p>
<p class="MsoNormal">                    elif response.status >= 500:<o:p></o:p></p>
<p class="MsoNormal">                        KSR.xlog.xinfo(f"SUB Manager Down: {response.status}")<o:p></o:p></p>
<p class="MsoNormal">                        KSR.tm.t_reply(500, "SUB Manager Down")<o:p></o:p></p>
<p class="MsoNormal">                    elif response.status >= 400:<o:p></o:p></p>
<p class="MsoNormal">                        KSR.xlog.xinfo(f"SUB Manager Error: {response.status}")<o:p></o:p></p>
<p class="MsoNormal">                        KSR.tm.t_reply(400, "SUB Manager Error")<o:p></o:p></p>
<p class="MsoNormal">                    else:<o:p></o:p></p>
<p class="MsoNormal">                        if response.status == 200:<o:p></o:p></p>
<p class="MsoNormal">                            KSR.xlog.xinfo(f"SUB Manager Success: {response.status}")<o:p></o:p></p>
<p class="MsoNormal">                            KSR.tm.t_reply(200, "OK")<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">        KSR.log("info", "SUBSCRIBE API Query Ends")<o:p></o:p></p>
<p class="MsoNormal">        asyncio.run(main())<o:p></o:p></p>
<p class="MsoNormal">        # API Query Ends<br>
<br>
<u>Scenario</u><br>
<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal">Initial SUBSCRIBE >>> hits Kamailio >>> send payload in JSON to API get receive 200OK response from API and send a 200OK on to Device
<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">SUBSCRIBE --------><o:p></o:p></p>
<p class="MsoNormal"><------------ 200 OK <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">After Subscription Expiry<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">re-SUBSCRIBE >>> hits Kamailio >>> send payload in JSON to API get 200OK response from API and send a 200OK on to Device but also another 200OK a fraction of a second later...<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">SUBSCRIBE --------><o:p></o:p></p>
<p class="MsoNormal"><------------ 200 OK <o:p></o:p></p>
<p class="MsoNormal"><<<--------- 200 OK <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><br>
This happens for all following re-SUBSCRIBE's<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">The 200 OK are identical, and it is a re transmission, but I can’t work out why..<br>
<br>
Relevant DEBUG is below<br>
<br>
Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: INFO: <script>: SUB Manager Success: 200<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3 [apy_kemi.c:232]: sr_apy_kemi_exec_func_ex(): execution of method: t_reply<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3 [apy_kemi.c:287]: sr_apy_kemi_exec_func_ex(): params[2] for: t_reply are int-str: [200] [OK]<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm [t_lookup.c:1034]: t_check_msg(): msg (0x7eff0cd4e828) id=2/11234 global id=2/11234 T start=0x7eff0918d7d8<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm [t_lookup.c:1108]: t_check_msg(): T (0x7eff0918d7d8) already found for msg (0x7eff0cd4e828)!<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: <core> [core/msg_translator.c:162]: check_via_address(): (80.111.111.111, 80.111.111.111, 0)<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm [t_reply.c:1763]: cleanup_uac_timers(): RETR/FR timers reset<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm [t_reply.c:637]: _reply_light(): reply sent out - buf=0x7eff0cd50938: SIP/2.0 200 OK#015#012Via:... shmem=0x7eff09190ca8: SIP/2.0 200 OK#015#012Via:<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm [t_reply.c:648]: _reply_light(): finished<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3 [apy_kemi.c:232]: sr_apy_kemi_exec_func_ex(): execution of method: t_precheck_trans<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3 [apy_kemi.c:232]: sr_apy_kemi_exec_func_ex(): execution of method: t_check_trans<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm [t_lookup.c:1034]: t_check_msg(): msg (0x7eff0cd4e828) id=2/11234 global id=2/11234 T start=0x7eff0918d7d8<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm [t_lookup.c:1108]: t_check_msg(): T (0x7eff0918d7d8) already found for msg (0x7eff0cd4e828)!<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: tm [t_reply.c:1703]: t_retransmit_reply(): reply retransmitted. buf=0x7eff0cb18220: SIP/2.0 2..., shmem=0x7eff09190ca8: SIP/2.0 2<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: app_python3 [apy_kemi.c:112]: sr_kemi_config_engine_python(): execution of route type 1 with no name returned 1<o:p></o:p></p>
<p class="MsoNormal">Jan 26 12:31:17 ip-172-20-46-39 kamailio[11234]: DEBUG: <core> [core/receive.c:514]: receive_msg(): request-route executed in: 38258 usec<br>
<br>
<br>
Everything works well as is but I want to clean up this issue or at least understand what is causing it.<br>
<br>
<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black;mso-fareast-language:EN-GB">Lewis</span></b><o:p></o:p></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"><br>
<br>
<br>
</span><o:p></o:p></p>
<pre>__________________________________________________________<o:p></o:p></pre>
<pre>Kamailio - Users Mailing List - Non Commercial Discussions<o:p></o:p></pre>
<pre>  * <a href="mailto:sr-users@lists.kamailio.org">sr-users@lists.kamailio.org</a><o:p></o:p></pre>
<pre>Important: keep the mailing list in the recipients, do not reply only to the sender!<o:p></o:p></pre>
<pre>Edit mailing list options or unsubscribe:<o:p></o:p></pre>
<pre>  * <a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.kamailio.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fsr-users&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434568697%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=j3l%2BsE40v6yyKQw%2FSLvzMBjdN%2FP%2FaJlzmjAy9NuPcRM%3D&reserved=0">https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users</a><o:p></o:p></pre>
</blockquote>
<pre>-- <o:p></o:p></pre>
<pre>Daniel-Constantin Mierla -- <a href="https://eur03.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.asipto.com%2F&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434568697%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=jp20nX4Y1Pk%2FqRddhdzjfnBuqUeMVZqlHxriFJdBMJU%3D&reserved=0">www.asipto.com</a><o:p></o:p></pre>
<pre><a href="https://eur03.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.twitter.com%2Fmiconda&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434568697%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=qVgJFf1eL%2FnEpYJH9EB6Pe60i3%2Bof4e%2Fb76JZ5MTrd4%3D&reserved=0">www.twitter.com/miconda</a> -- <a href="https://eur03.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.linkedin.com%2Fin%2Fmiconda&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434568697%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=JtTJgQ9kKvmP5c4sCSx83nOa6dAzC10D0hEKKM3Q6b0%3D&reserved=0">www.linkedin.com/in/miconda</a><o:p></o:p></pre>
<pre>Kamailio Advanced Training - Online<o:p></o:p></pre>
<pre>  Feb 21-24, 2022 (America Timezone)<o:p></o:p></pre>
<pre>  * <a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.asipto.com%2Fsw%2Fkamailio-advanced-training-online%2F&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434724907%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=aadNjjGug1W7KCvzOzMcIKeciLByeAK0ys7RAuK%2F6p0%3D&reserved=0">https://www.asipto.com/sw/kamailio-advanced-training-online/</a><o:p></o:p></pre>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"><br>
<br>
<o:p></o:p></span></p>
<pre>__________________________________________________________<o:p></o:p></pre>
<pre>Kamailio - Users Mailing List - Non Commercial Discussions<o:p></o:p></pre>
<pre>  * <a href="mailto:sr-users@lists.kamailio.org">sr-users@lists.kamailio.org</a><o:p></o:p></pre>
<pre>Important: keep the mailing list in the recipients, do not reply only to the sender!<o:p></o:p></pre>
<pre>Edit mailing list options or unsubscribe:<o:p></o:p></pre>
<pre>  * <a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.kamailio.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fsr-users&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434724907%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=rszwoOsHHcfSylU3mcB3fqRUlqCbjmXLC0tgrHDpjVE%3D&reserved=0">https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users</a><o:p></o:p></pre>
</blockquote>
<pre>-- <o:p></o:p></pre>
<pre>Daniel-Constantin Mierla -- <a href="https://eur03.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.asipto.com%2F&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434724907%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=R0qcM%2Bd%2FSb%2BtqLv6jqhncTt7STIFhljiU27NG3gX3Aw%3D&reserved=0">www.asipto.com</a><o:p></o:p></pre>
<pre><a href="https://eur03.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.twitter.com%2Fmiconda&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434724907%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=QuWHJIivqvcfIT6fe8%2B8TB5PzZMdWcmioVTxOgHvj%2FM%3D&reserved=0">www.twitter.com/miconda</a> -- <a href="https://eur03.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.linkedin.com%2Fin%2Fmiconda&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434724907%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=jsZ9vqERFDJUKuFHOcdyBRrQNZ7kcOEETUdd8ii%2Fy7s%3D&reserved=0">www.linkedin.com/in/miconda</a><o:p></o:p></pre>
<pre>Kamailio Advanced Training - Online<o:p></o:p></pre>
<pre>  Feb 21-24, 2022 (America Timezone)<o:p></o:p></pre>
<pre>  * <a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.asipto.com%2Fsw%2Fkamailio-advanced-training-online%2F&data=04%7C01%7Clewis.hutchinson%40missionlabs.co.uk%7Cff717fb50bfc49d1b91e08d9e17c5dc4%7C97c26f550a7a4661bd8f7b43b50d3f2b%7C0%7C0%7C637788747434724907%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=aadNjjGug1W7KCvzOzMcIKeciLByeAK0ys7RAuK%2F6p0%3D&reserved=0">https://www.asipto.com/sw/kamailio-advanced-training-online/</a><o:p></o:p></pre>
</div>
</body>
</html>