> The kamailio script, completely stateless as I do not need to keep track of 
> the sessions, iterates through one of the JSON branches and adds the 
> destination URLs to the Contact header and replies a SIP 300 Multiple Choices.


The term 'stateless' in the scope of a SIP proxy doesn't mean to keep track of 
the session (or the dialog).  It means tracking the state of the transaction.  
In order to pause the current transaction and resume it (using 
http_async_query()), a stateful transaction must be created within Kamailio - 
and you've done this when you call `t_newtran()`.  As a recommendation, rather 
than using `sl_send_reply()`, `t_reply()`, or `t_send_reply()`, just  use 
`send_reply()`, which will send the reply statelessly if there's no 
transaction, and statefully if there is a transaction.


If you want to make your replies LOOK stateless to request source, disable 
automatic 100 Trying from the TM module.



Kaufman
Senior Voice Engineer



E: [email protected]




SIP.US Client Support: 800.566.9810  |  SIPTRUNK Client Support: 800.250.6510  
|  Flowroute Client Support: 855.356.9768
[img]<https://www.sip.us/>
[img]<https://www.siptrunk.com/>
[img]<https://www.flowroute.com/>


From: Sergio Charrua via sr-users <[email protected]>
Sent: Monday, April 8, 2024 10:13 AM
To: Kamailio (SER) - Users Mailing List <[email protected]>
Cc: Sergio Charrua <[email protected]>
Subject: [SR-Users] making HTTP requests in stateless redirects


CAUTION: This email originated from outside the organization. Do not click 
links or open attachments unless you recognize the sender and know the content 
is safe.

Hi all!


For testing purposes, while I am waiting for the ST/SH REST API to be available 
from other teams, I developed a small python REST API that returns a mockup of 
a JSON object with some of the required values.
The kamailio script, completely stateless as I do not need to keep track of the 
sessions, iterates through one of the JSON branches and adds the destination 
URLs to the Contact header and replies a SIP 300 Multiple Choices.
This works: the UAC does receive the SIP response with the Contacts , but it 
also receives a SIP 500 error message right after, and I can't figure out why. 
And i bet this is simple to solve....
Any clue? I'm aware I'm not processing ACK messages, but the sl_send_reply 403 
should do the trick right? ... at least while testing....

Also, as this is a stateless script, is there another way of using async http 
or making http requests to a REST API without having to use TM Module?

Thanks in advance.

The kamailio script is has follows:

#!KAMAILIO
/* add API http timeout */
#!define HTTP_API_TIMEOUT 5000
#!define HTTP_API_ROUTING_ENDPOINT "http://some_python_rest_api/get_route";
### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR
debug=4
log_stderror=no
memdbg=5
memlog=5
log_facility=LOG_LOCAL0
log_prefix="{$mt $hdr(CSeq) $ci} "
/* number of SIP routing processes */
children=2
/* set paths to location of modules */
loadmodule "tm.so"
loadmodule "jsonrpcs.so"
loadmodule "kex.so"
loadmodule "corex.so"
loadmodule "sl.so"
loadmodule "db_mysql.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "ipops.so"
loadmodule "textops.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
loadmodule "ctl.so"
loadmodule "cfg_rpc.so"
loadmodule "uac.so"
loadmodule "counters.so"
loadmodule "http_async_client.so"
loadmodule "jansson.so"
loadmodule "usrloc.so"
/* listen addresses */
listen=udp:10.20.0.2:5060
<http://10.20.0.2:5060/>listen=udp:10.20.0.2:5062
<http://10.20.0.2:5062/>advertised_address="10.20.0.2";
# ----- http_async_client params -----
modparam("http_async_client", "workers", HTTP_ASYNC_CLIENT_WORKERS)
modparam("http_async_client", "connection_timeout", 2000)
request_route {
  #route(HANDLE_DMQ);
  route(HANDLE_OPTIONS);
  if (is_method("INVITE"))
  {
    xlog("L_INFO","MAIN - calling TO_CARRIER");
    route(TO_CARRIER);
    exit;
  }
  else{
        sl_send_reply("401","UNAUTHORIZED");
  }
}
route[TO_CARRIER]{
        xlog("L_INFO","TO_CARRIER - calling RELAY_API");
        route(RELAY_API);                   #Route relay
        xlog("L_INFO","TO_CARRIER - return");
        return;
}
# Relay request using the API (response)
route[RELAY_API_RESPONSE] {
    xlog("L_INFO","RELAY_API_RESPONSE - got response from REST API");
        if ($http_ok==1 && $http_rs==200)
        {
                xlog("L_INFO","RELAY_API_RESPONSE - HTTP RESPONSE: $http_rb\n");
                if (jansson_get("json", $http_rb, "$var(json)")) {
                        xlog("L_INFO","RELAY_API_RESPONSE - JSON = $var(json)");
                        $var(count) = 0;
                        jansson_array_size("routes", $var(json), "$var(size)");
                        xlog("L_INFO","RELAY_API_RESPONSE - 
jansson_array_size");

                    while ( $var(count) < $var(size) ){
                                
jansson_get("routes[$var(count)].headers.to.uri", $var(rtjson), "$var(v)");
                                xlog("L_INFO","JSON - routes[$var(count)] - 
$var(v)");
                                #$(avp(mycontacts)[$var(count)]) = 
$avp(mycontacts) + $var(v) + "\r\n";
                                $avp(mycontacts) = $avp(mycontacts) + $var(v) + 
";";

                                append_to_reply("Contact: <" + $var(v)  +">"+ 
"\r\n"); /*   ----  IS THERE A BETTER ?? ..... */

                                $var(count) = $var(count) + 1;
                        }

                        xlog("L_INFO","RELAY_API_RESPONSE - RELAY");
                        xlog("L_INFO","MAIN - calling REPLY_302");
                        route(REPLY_302);
                        return;
                }
        }
        send_reply(500, "API Not Available - http response = $http_rs 
$http_ok");
        exit;
}
route[RELAY_API] {
        xlog("L_INFO","RELAY_API - from_ip $si:$sp from_number $fU to_number 
$ru");
        $http_req(all) = $null;
        $http_req(suspend) = 1;
        $http_req(timeout) = HTTP_API_TIMEOUT;
        $http_req(method) = "POST";
        $http_req(hdr) = "Content-Type: application/json";
        jansson_set("string","from_ip",$si, "$var(http_routing_query)");
        jansson_set("string","from_port",$sp, "$var(http_routing_query)");
        jansson_set("string","from_number",$fU, "$var(http_routing_query)");
        jansson_set("string","to_number",$ru , "$var(http_routing_query)");

        xlog("L_INFO","RELAY_API - API ASYNC ROUTING REQUEST: 
$var(http_routing_query)\n");
        $http_req(body) = $var(http_routing_query);
        t_newtran();
        http_async_query(HTTP_API_ROUTING_ENDPOINT, "RELAY_API_RESPONSE");
        xlog("L_INFO","RELAY_API - Waiting for Response");
}
route[REPLY_302] {
  # Sends a 300 Multiple Choices back to the proxy that requested the routing 
lookup
  xlog("L_INFO","REPLY_302 - send reply");
  sl_send_reply("300", "Multiple Choices");
  xlog("L_INFO","REPLY_302 - exit");
  exit;
}
route[HANDLE_OPTIONS]{
        if(is_method("OPTIONS"))
        {
           sl_send_reply(200, "OK");
           exit;
        }
        if ($fU=="ping")
        {
                sl_send_reply("200","OK");
                exit;
        }
}

SNGrep output:
1 - INVITE from UAC to Kamailio

INVITE sip:[email protected]<mailto:sip%[email protected]> SIP/2.0
Via: SIP/2.0/UDP 10.20.0.1:5063;branch=z9hG4bK58aa83f4
Max-Forwards: 70
From: "Anonymous" <sip:[email protected]:5063>;tag=as192b8891
To: <sip:[email protected]<mailto:sip%[email protected]>>
Contact: <sip:[email protected]:5063<http://sip:[email protected]:5063/>>
Call-ID: 
[email protected]:5063<http://[email protected]:5063/>
CSeq: 102 INVITE
User-Agent: SIPp
Date: Mon, 08 Apr 2024 15:09:51 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, 
PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 270
v=0
o=root 2021555890 2021555890 IN IP4 10.20.0.1
s=SIPp
c=IN IP4 10.20.0.1
t=0 0
m=audio 18422 RTP/AVP 8 0 101
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=maxptime:150
a=sendrecv

2 - Reply from Kamailio to UAC

SIP/2.0 100 trying -- your call is important to us
Via: SIP/2.0/UDP 10.20.0.1:5063;branch=z9hG4bK58aa83f4
From: "Anonymous" <sip:[email protected]:5063>;tag=as192b8891
To: <sip:[email protected]<mailto:sip%[email protected]>>
Call-ID: 
[email protected]:5063<http://[email protected]:5063/>
CSeq: 102 INVITE
Server: kamailio (5.7.4 (x86_64/linux))
Content-Length: 0

3 - SIP 300 Multiple Choices from Kamailio to UAC

SIP/2.0 300 Multiple Choices
Via: SIP/2.0/UDP 10.20.0.1:5063;branch=z9hG4bK58aa83f4
From: "Anonymous" <sip:[email protected]:5063>;tag=as192b8891
To: 
<sip:[email protected]<mailto:sip%[email protected]>>;tag=57c593265e21c2b70aea50cb414df9cd.32679ccd
Call-ID: 
[email protected]:5063<http://[email protected]:5063/>
CSeq: 102 INVITE
Contact: <sip:sip:[email protected][email protected]<http://sip.domain.io/>>
Contact: <sip:+351sip:[email protected]@10.20.0.3<http://10.20.0.3/>>
Server: kamailio (5.7.4 (x86_64/linux))
Content-Length: 0

4 - SIP 500 from Kamailio to UAC

SIP/2.0 500 I'm terribly sorry, server error occurred (1/TM)
Via: SIP/2.0/UDP 10.20.0.1:5063;branch=z9hG4bK58aa83f4
From: "Anonymous" <sip:[email protected]:5063>;tag=as192b8891
To: 
<sip:[email protected]<mailto:sip%[email protected]>>;tag=4eb2322b7d2b68e6fc3168f503344c21-32679ccd
Call-ID: 
[email protected]:5063<http://[email protected]:5063/>
CSeq: 102 INVITE
Server: kamailio (5.7.4 (x86_64/linux))
Content-Length: 0

5 - ACK from UAC to Kamailio

ACK sip:[email protected]<mailto:sip%[email protected]> SIP/2.0
Via: SIP/2.0/UDP 10.20.0.1:5063;branch=z9hG4bK58aa83f4
Max-Forwards: 70
From: "Anonymous" <sip:[email protected]:5063>;tag=as192b8891
To: 
<sip:[email protected]<mailto:sip%[email protected]>>;tag=57c593265e21c2b70aea50cb414df9cd.32679ccd
Contact: <sip:[email protected]:5063<http://sip:[email protected]:5063/>>
Call-ID: 
[email protected]:5063<http://[email protected]:5063/>
CSeq: 102 ACK
User-Agent: SIPp
Content-Length: 0

and continues with ACK and repeating SIP 500 above....






Sérgio Charrua
.




__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions
To unsubscribe send an email to [email protected]
Important: keep the mailing list in the recipients, do not reply only to the 
sender!
Edit mailing list options or unsubscribe:

Reply via email to