[sr-dev] git:master: modules/sl: Added event_route[sl:local-response]

Peter Dunkley peter.dunkley at crocodile-rcs.com
Tue Mar 6 19:36:27 CET 2012


Module: sip-router
Branch: master
Commit: 3431ea3c2dda8906add5e005e263124a068c7d84
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=3431ea3c2dda8906add5e005e263124a068c7d84

Author: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Date:   Tue Mar  6 18:16:38 2012 +0000

modules/sl: Added event_route[sl:local-response]

- The same as event_route[tm:local-response] but for stateless
  responses

---

 modules/sl/sl_funcs.c |   89 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 89 insertions(+), 0 deletions(-)

diff --git a/modules/sl/sl_funcs.c b/modules/sl/sl_funcs.c
index 67a2836..18d4217 100644
--- a/modules/sl/sl_funcs.c
+++ b/modules/sl/sl_funcs.c
@@ -58,6 +58,9 @@
 #include "../../config.h"
 #include "../../tags.h"
 #include "../../parser/parse_to.h"
+#include "../../route.h"
+#include "../../receive.h"
+#include "../../onsend.h"
 #include "sl_stats.h"
 #include "sl_funcs.h"
 #include "sl.h"
@@ -130,6 +133,9 @@ int sl_reply_helper(struct sip_msg *msg, int code, char *reason, str *tag)
 	int backup_mhomed, ret;
 	str text;
 
+	int rt, backup_rt;
+	struct run_act_ctx ctx;
+	struct sip_msg pmsg;
 
 	if (msg->first_line.u.request.method_value==METHOD_ACK)
 		goto error;
@@ -200,6 +206,89 @@ int sl_reply_helper(struct sip_msg *msg, int code, char *reason, str *tag)
 	dst.send_flags=msg->rpl_send_flags;
 	ret = msg_send(&dst, buf.s, buf.len);
 	mhomed=backup_mhomed;
+
+	rt = route_lookup(&event_rt, "sl:local-response");
+	if (unlikely(rt >= 0 && event_rt.rlist[rt] != NULL))
+	{
+		if (likely(build_sip_msg_from_buf(&pmsg, buf.s, buf.len,
+				inc_msg_no()) == 0))
+		{
+			char *tmp = NULL;
+			struct onsend_info onsnd_info;
+
+			onsnd_info.to=&dst.to;
+			onsnd_info.send_sock=dst.send_sock;
+			onsnd_info.buf=buf.s;
+			onsnd_info.len=buf.len;
+			p_onsend=&onsnd_info;
+
+			if (unlikely(!IS_SIP(msg)))
+			{
+				/* This is an HTTP reply...  So fudge in a CSeq into the parsed message
+ 				   message structure so that $rm will work in the route */
+				struct hdr_field *hf;
+				struct cseq_body *cseqb;
+				char *tmp2;
+				int len;
+
+				if ((hf = (struct hdr_field *) pkg_malloc(sizeof(struct hdr_field))) == NULL)
+				{
+					LM_ERR("out of package memory\n");
+					goto event_route_error;
+				}
+
+				if ((cseqb = (struct cseq_body *) pkg_malloc(sizeof(struct cseq_body))) == NULL)
+				{
+					LM_ERR("out of package memory\n");
+					pkg_free(hf);
+					goto event_route_error;
+				}
+
+				if ((tmp = (char *) pkg_malloc(sizeof(char) * (msg->first_line.u.request.method.len + 5))) == NULL)
+				{
+					LM_ERR("out of package memory\n");
+					pkg_free(cseqb);
+					pkg_free(hf);
+					goto event_route_error;
+				}
+
+				memset(hf, 0, sizeof(struct hdr_field));
+				memset(cseqb, 0, sizeof(struct cseq_body));
+
+				len = sprintf(tmp, "0 %.*s\r\n", msg->first_line.u.request.method.len, msg->first_line.u.request.method.s);
+				tmp2 = parse_cseq(tmp, &tmp[len], cseqb);
+
+				hf->type = HDR_CSEQ_T;
+				hf->body.s = tmp;
+				hf->body.len = tmp2 - tmp;
+				hf->parsed = cseqb;
+
+				pmsg.parsed_flag|=HDR_CSEQ_F;
+				pmsg.cseq = hf;
+				if (pmsg.last_header==0) {
+					pmsg.headers=hf;
+					pmsg.last_header=hf;
+				} else {
+					pmsg.last_header->next=hf;
+					pmsg.last_header=hf;
+				}
+			}
+
+			backup_rt = get_route_type();
+			set_route_type(LOCAL_ROUTE);
+			init_run_actions_ctx(&ctx);
+			run_top_route(event_rt.rlist[rt], &pmsg, 0);
+			set_route_type(backup_rt);
+			p_onsend=0;
+
+			if (tmp != NULL)
+				pkg_free(tmp);
+
+event_route_error:
+			free_sip_msg(&pmsg);
+		}
+	}
+
 	pkg_free(buf.s);
 
 	if (ret<0) {




More information about the sr-dev mailing list