Module: kamailio Branch: master Commit: 356ef94bded6d6e63f659b405dc6758de17b694a URL: https://github.com/kamailio/kamailio/commit/356ef94bded6d6e63f659b405dc6758d...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2015-04-18T17:12:12+02:00
uac: option to execute event_route[uac:reply] for uac_req_send() replies
- $uac(evroute) has to be set to 1 and event_route[uac:reply] defined - inside event_route[uac_reply] the $uac_req(...) variable is restored back as before uac_req_send(), having the values from that time, excepting: - $uac_req(evcode) is set to the reply code - $uac_req(evtype) is set to 1 if the reply was received or to 2 if the reply was self generated (e.g., case of transmission timeout) - if $uac_req(evtype)==1, the message processed inside the event route is the received reply, otherwise is a faked request with no relation to the request sent out by uac_req_send()
---
Modified: modules/uac/uac_send.c
---
Diff: https://github.com/kamailio/kamailio/commit/356ef94bded6d6e63f659b405dc6758d... Patch: https://github.com/kamailio/kamailio/commit/356ef94bded6d6e63f659b405dc6758d...
---
diff --git a/modules/uac/uac_send.c b/modules/uac/uac_send.c index 62b3950..0309b20 100644 --- a/modules/uac/uac_send.c +++ b/modules/uac/uac_send.c @@ -20,6 +20,7 @@
#include "../../dprint.h" #include "../../trim.h" +#include "../../route.h"
#include "../../modules/tm/tm_load.h"
@@ -27,6 +28,7 @@ #include "../../parser/parse_from.h" #include "../../parser/parse_to.h" #include "../../parser/contact/parse_contact.h" +#include "../../lib/kcore/faked_msg.h"
#include "auth.h" #include "auth_hdr.h" @@ -605,6 +607,41 @@ int uac_send_tmdlg(dlg_t *tmdlg, sip_msg_t *rpl)
#define MAX_UACH_SIZE 2048
+/** + * + */ +void uac_req_run_event_route(sip_msg_t *msg, uac_send_info_t *tp, int rcode) +{ + char *evrtname = "uac:reply"; + int rt, backup_rt; + struct run_act_ctx ctx; + sip_msg_t *fmsg; + + rt = route_get(&event_rt, evrtname); + if (rt < 0 || event_rt.rlist[rt] == NULL) + { + LM_DBG("event_route[uac:reply] does not exist\n"); + return; + } + + uac_send_info_copy(tp, &_uac_req); + _uac_req.evcode = rcode; + if(msg==NULL) + { + _uac_req.evtype = 2; + fmsg = faked_msg_get_next(); + } else { + _uac_req.evtype = 1; + fmsg = msg; + } + + backup_rt = get_route_type(); + set_route_type(REQUEST_ROUTE); + init_run_actions_ctx(&ctx); + run_top_route(event_rt.rlist[rt], fmsg, 0); + set_route_type(backup_rt); +} + /** * TM callback function */ @@ -622,13 +659,21 @@ void uac_send_tm_callback(struct cell *t, int type, struct tmcb_params *ps) dlg_t tmdlg; uac_send_info_t *tp = NULL;
+ LM_DBG("tm callback with status %d\n", ps->code); + if(ps->param==NULL || *ps->param==0) { - LM_DBG("message id not received\n"); + LM_DBG("callback param with message id not received\n"); goto done; } tp = (uac_send_info_t*)(*ps->param); - if(ps->code != 401 && ps->code != 407) + + if(tp->evroute!=0) { + uac_req_run_event_route((ps->rpl==FAKED_REPLY)?NULL:ps->rpl, + tp, ps->code); + } + + if((ps->code != 401 && ps->code != 407) || tp->s_apasswd.len<=0) { LM_DBG("completed with status %d\n", ps->code); goto done;
On 18 Apr 2015, at 21:59, Daniel-Constantin Mierla miconda@gmail.com wrote:
uac: option to execute event_route[uac:reply] for uac_req_send() replies
- $uac(evroute) has to be set to 1 and event_route[uac:reply] defined
- inside event_route[uac_reply] the $uac_req(...) variable is restored
back as before uac_req_send(), having the values from that time, excepting:
- $uac_req(evcode) is set to the reply code
- $uac_req(evtype) is set to 1 if the reply was received or to 2 if the reply was self generated (e.g., case of transmission timeout)
- if $uac_req(evtype)==1, the message processed inside the event route is the
received reply, otherwise is a faked request with no relation to the request sent out by uac_req_send()
Very cool! Thank you Daniel!
/O
On 19/04/15 15:17, Olle E. Johansson wrote:
On 18 Apr 2015, at 21:59, Daniel-Constantin Mierla miconda@gmail.com wrote:
uac: option to execute event_route[uac:reply] for uac_req_send() replies
- $uac(evroute) has to be set to 1 and event_route[uac:reply] defined
- inside event_route[uac_reply] the $uac_req(...) variable is restored
back as before uac_req_send(), having the values from that time, excepting:
- $uac_req(evcode) is set to the reply code
- $uac_req(evtype) is set to 1 if the reply was received or to 2 if the reply was self generated (e.g., case of transmission timeout)
- if $uac_req(evtype)==1, the message processed inside the event route is the
received reply, otherwise is a faked request with no relation to the request sent out by uac_req_send()
Very cool! Thank you Daniel!
Thank you and welcome! With the side note that real testing was not done yet, as we are going to freeze for v4.3 soon and the plan is to do it during that period. Of course, testing and feedback by anyone out there is very appreciated!
Cheers, Daniel