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;
}
>