Re: send_reply not accepting values

Henning Westerholt via sr-users <[email protected]>
Newsgroups gmane.comp.voip.ser
Message-ID <AS8PR07MB8103E76BAD7FF56F8394E4F1BF0FA@AS8PR07MB8103.eurprd07.prod.outlook.com>
Hello,

did not looked to the whole script, but the usual action would be enabling the debug log and see where the 503 is actually generated from.

Cheers,

Henning

From: Sergio Charrua via sr-users <[email protected]>
Sent: Freitag, 5. September 2025 19:34
To: Kamailio (SER) - Users Mailing List <[email protected]>
Cc: Sergio Charrua <[email protected]>
Subject: [SR-Users] send_reply not accepting values

Hi all!

I'm using EVAPI module. Upon INVITE, Kamailio gets a list of routes from a script using evapi_async_relay() . The EVAPI script (Python) then returns a RTJson structure.
The Kamailio logic is set to iterate through each route and if at the end all routes have failed (ex.: if all egress endpoints are unavailable), then sends a EVAPI request using evapi_relay() to the script. Note that this request is not asynchronous (using evapi_async_relay() would fail with error stating that there is no transaction available....).

This is my evapi:message-received:

event_route[evapi:message-received]
{
    # Parse the message format: RESPONSE:index:label:data
    $var(msg) = $evapi(msg);
    #$var(logmsg) = $(var(msg){s.substr,0,100});
    xlog("L_INFO", "evapi:message-received - Received EVAPI message: $var(msg) ...\n");


    $var(type) = $(var(msg){s.select,0,:});
    $var(tindex) = $(var(msg){s.select,1,:}{s.int<http://s.int>});
    $var(tlabel) = $(var(msg){s.select,2,:}{s.int<http://s.int>});
    $var(response) = $(var(msg){re.subst,/^[^:]*:[^:]*:[^:]*://});

    xlog("L_INFO", "Part 0: '$var(type)'\n");
    xlog("L_INFO", "Part 1: '$var(tindex)'\n");
    xlog("L_INFO", "Part 2: '$var(tlabel)'\n");
    xlog("L_INFO", "Part 3: '$var(response)'\n");

    if (  $var(type) == "RESPONSE" && $var(tindex) =~ "^[0-9]+$" &&  $var(tlabel) =~ "^[0-9]+$" )
    {
        xlog("L_INFO", "evapi:message-received - RESPONSE index $var(tindex) label $var(tlabel) \n");

        xlog("L_INFO", "evapi:message-received - Continue Call processing\n");

        if (jansson_get("action", $var(response), "$var(action)")){
            if ($var(action) == "CALL_REJECT"){
                route(EVAPIRESPONSE);
            }
        }
        # Resume transaction
        t_continue("$var(tindex)", "$var(tlabel)", "EVAPIRESPONSE");
    }
    else
    {
        xlog("L_INFO",  "evapi:message-received - invalid message received from EVAPI. Cancelling the call \n");
        t_reply("500", "Internal Server Error");
        exit;
    }
}

CALL_REJECT action is received after the evapi_relay() request to the EVAPI script (python) that is launched after a route_failure.
For example, Kamailio requests for error mappings when a call has been tried and no egress endpoint was reachable.

My EVAPIRESPONSE route block is:

route[EVAPIRESPONSE] {
    xlog("L_INFO", "EVAPIRESPONSE - Resuming INVITE processing with index $var(tindex) label $var(tlabel)\n");
    xlog("L_INFO", "EVAPIRESPONSE - JSON : $var(response) \n");

    # Test each condition individually
    if ($var(response) == "FALSE" or $var(response) == "NO_ROUTES")
    {
        # Check if response is FALSE (drop the call)
        xlog("L_ERR", "EVAPIRESPONSE - Python script returned FALSE or NO ROUTES, dropping call\n");
        $var(code) = 500;
        $var(text) = "Internal Server Error";
        route(REPLY_SAFE);
        exit;
    }

    if (jansson_get("action", $var(response), "$var(action)")){
        if ($var(action) == "DROP") {
            jansson_get("error_code", $var(response), "$var(error_code)");
            jansson_get("error_text", $var(response), "$var(error_text)");
            xlog("L_INFO", "EVAPIRESPONSE - dropping call with returned error $var(error_code) - $var(error_text) \n");
            $var(code) = $var(error_code);
            $var(text) = $var(error_text);
            route(REPLY_SAFE);
        }else
        if ($var(action) == "CALL_REJECT")
        {
            jansson_get("reject", $var(response), "$var(sip_error)");
            if ( "$var(sip_error)" == "" )
            {
                xlog("L_INFO", "EVAPIRESPONSE - CALL_REJECT with no specific error code; return the received error\n");
                return;
            }
            else
            {
                jansson_get("error_code", $var(sip_error), "$var(error_code)");
                jansson_get("error_text", $var(sip_error), "$var(error_text)");
                xlog("L_INFO", "EVAPIRESPONSE - CALL_REJECT with $var(error_code) - $var(error_text)\n");
                $var(code) = $var(error_code);
                $var(text) = $var(error_text);
                route(REPLY_SAFE);
            }
        }
    }

    # Process RTJSON routing
    if (jansson_get("rtjson", $var(response), "$var(rtjson_str)")) {
        jansson_get("retry_on_failure", $var(response), "$dlg_var(retry_on_failure)");
        xlog("L_DEBUG", "EVAPIRESPONSE - retry_on_failure = $dlg_var(retry_on_failure) \n");
        $dlg_var(rtjson_str) = $var(rtjson_str);
        # Process routes from RTJSON
        route(RTJSON_PROCESS);
    } else {
        xlog("L_ERR", "EVAPIRESPONSE - Invalid response format from Python\n");
        $var(code) = 500;
        $var(text) = "Internal Server Error";
        route(REPLY_SAFE);
        exit;
    }
}

# Tiny helper to reply correctly inside/outside TM
route[REPLY_SAFE] {
    # validate code (default to 480 if bad/empty)
    if (!($var(code) =~ "^[1-6][0-9][0-9]$")) $var(code) = 480;
    if ($var(text) == "") $var(text) = "Temporarily Unavailable";
    # remove CR/LF that can break the reason phrase
    $var(text) = $(var(text){re.subst,/[\r\n]/ /g});

    if (t_check_trans()) {
        xlog("L_INFO", "REPLY_SAFE - replying with t_reply\n");
        t_reply("$var(code)", "$var(text)");
    } else {
        xlog("L_INFO", "REPLY_SAFE - replying with send_reply\n");
        send_reply("$var(code)", "$var(text)");
    }
    exit;
}

I have tried with t_reply, sl_send_reply, send_reply but the SIP trace only shows SIP 503 Service Unavailable being sent from Kamailio to the ingress endpoint.
Setting log to DEBUG level doesn't show anything neither:

Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169257 457395 1 1 OPTIONS 123} <script>: evapi:message-received - Received EVAPI message: RESPONSE:2825:1816929401:{"action": "CALL_REJECT", "call_id": "[email protected]:5060<http://[email protected]:5060>", "reject": {"error_code": 480, "error_text": "some text"}} ...
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169485 457395 1 1 OPTIONS 123} <script>: Part 0: 'RESPONSE'
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169497 457395 1 1 OPTIONS 123} <script>: Part 1: '2825'
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169506 457395 1 1 OPTIONS 123} <script>: Part 2: '1816929401'
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169514 457395 1 1 OPTIONS 123} <script>: Part 3: '{"action": "CALL_REJECT", "call_id": "[email protected]:5060<http://[email protected]:5060>", "reject": {"error_code": 480, "error_text": "some text"}}'
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169639 457395 1 1 OPTIONS 123} <script>: evapi:message-received - RESPONSE index 2825 label 1816929401
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169654 457395 1 1 OPTIONS 123} <script>: evapi:message-received - Continue Call processing
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169816 457395 1 1 OPTIONS 123} <script>: EVAPIRESPONSE - Resuming INVITE processing with index 2825 label 1816929401
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169829 457395 1 1 OPTIONS 123} <script>: EVAPIRESPONSE - JSON : {"action": "CALL_REJECT", "call_id": "[email protected]:5060<http://[email protected]:5060>", "reject": {"error_code": 480, "error_text": "some text"}}
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.169998 457395 1 1 OPTIONS 123} <script>: EVAPIRESPONSE - CALL_REJECT with 480 - some text
Sep  5 19:16:48 ire-lab-kamailio1 kamailio[457395]: INFO: {1757092608.170253 457395 1 1 OPTIONS 123} <script>: REPLY_SAFE - replying with send_reply


And nothing helps is found in logs.

The goal is to send a custom SIP error and message depending if the error_code and error_text is specified. If not, then the message received from egress endpoint should be forwarded to the ingress endpoint.
I just can't understand why the response is always SIP 503.

Here is a SIP trace:

[cid:[email protected]]

Any suggestions?

Thanks in advance.


Atenciosamente / Kind Regards / Cordialement / Un saludo,



Sérgio Charrua

__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions -- [email protected]
To unsubscribe send an email to [email protected]
Important: keep the mailing list in the recipients, do not reply only to the sender!
image001.png (image/png, 29.4 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.