Hi,

i have a use case where i need to use failure_route for local transactions like this.

route[TIMER_ROUTE]
{
    ... do sql
    while rows
      t_uac_send ...
}

event_route[tm:local-request]
{
    if this is my request
       t_on_reply("MY_REPLY");
       t_on_failure("MY_FAULT");
       t_set_fr(0, MY_TIMEOUT);
       handle_ruri_alias();
       record_route();      
}

but MY_FAULT is never called even for 408 (timeout)

i tracked down to t_reply:run_failure_handlers where the check fails.
...
struct sip_msg *shmem_msg = t->uas.request;
...
if (!shmem_msg) {
LM_WARN("no UAC support (%d, %d) \n", on_failure, t->tmcb_hl.reg_types);
return 0;
}
...

i changed the code a bit  to check for is_local and parse the the request and it works for me, however i would like other to comment on this approach as there may be a simpler solution.
thanks

if (!shmem_msg) {
sip_msg_t local_msg;

if(!is_local(t)) {
LM_WARN("no UAC support (%d, %d) \n", on_failure, t->tmcb_hl.reg_types);
return 0;
}

/* parse the retr. buffer */
memset(&local_msg, 0, sizeof(struct sip_msg));
local_msg.buf = t->uac[picked_branch].request.buffer;
local_msg.len = t->uac[picked_branch].request.buffer_len;
if (parse_msg(local_msg.buf, local_msg.len, &local_msg) != 0) {
LM_ERR("failed to parse retr buffer (weird!): \n%.*s\n",
(int)local_msg.len, local_msg.buf);
return 0;
}

t->uas.request = sip_msg_shm_clone(&local_msg, NULL, 1);

free_sip_msg(&local_msg);

if(!t->uas.request) {
LM_ERR("UAS REQ IS NULL AFTER PARSE \n");
return 0;
}

shmem_msg = t->uas.request;

}