|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright (C) 2010 Daniel-Constantin Mierla (asipto.com)
|
|
|
+ * Copyright (C) 2010-2017 Daniel-Constantin Mierla (asipto.com)
|
|
|
*
|
|
|
* This file is part of Kamailio, a free SIP server.
|
|
|
*
|
|
@@ -13,8 +13,8 @@
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
* GNU General Public License for more details.
|
|
|
*
|
|
|
- * You should have received a copy of the GNU General Public License
|
|
|
- * along with this program; if not, write to the Free Software
|
|
|
+ * You should have received a copy of the GNU General Public License
|
|
|
+ * along with this program; if not, write to the Free Software
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
*
|
|
|
*/
|
|
@@ -67,6 +67,7 @@ static regex_t xhttp_url_skip_regexp;
|
|
|
/** SL API structure */
|
|
|
sl_api_t slb;
|
|
|
|
|
|
+static str xhttp_event_callback = STR_NULL;
|
|
|
|
|
|
static cmd_export_t cmds[] = {
|
|
|
{"xhttp_reply", (cmd_function)w_xhttp_send_reply,
|
|
@@ -87,6 +88,7 @@ static pv_export_t mod_pvs[] = {
|
|
|
static param_export_t params[] = {
|
|
|
{"url_match", PARAM_STRING, &xhttp_url_match},
|
|
|
{"url_skip", PARAM_STRING, &xhttp_url_skip},
|
|
|
+ {"event_callback", PARAM_STR, &xhttp_event_callback},
|
|
|
{0, 0, 0}
|
|
|
};
|
|
|
|
|
@@ -120,18 +122,28 @@ static int mod_init(void)
|
|
|
{
|
|
|
struct nonsip_hook nsh;
|
|
|
int route_no;
|
|
|
-
|
|
|
- route_no=route_get(&event_rt, "xhttp:request");
|
|
|
- if (route_no==-1)
|
|
|
- {
|
|
|
- LM_ERR("failed to find event_route[xhttp:request]\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
- if (event_rt.rlist[route_no]==0)
|
|
|
- {
|
|
|
- LM_WARN("event_route[xhttp:request] is empty\n");
|
|
|
+ sr_kemi_eng_t *keng = NULL;
|
|
|
+
|
|
|
+ if(xhttp_event_callback.s!=NULL && xhttp_event_callback.len>0) {
|
|
|
+ keng = sr_kemi_eng_get();
|
|
|
+ if(keng==NULL) {
|
|
|
+ LM_ERR("failed to find kemi engine\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ xhttp_route_no=-1;
|
|
|
+ } else {
|
|
|
+ route_no=route_lookup(&event_rt, "xhttp:request");
|
|
|
+ if (route_no==-1)
|
|
|
+ {
|
|
|
+ LM_ERR("failed to find event_route[xhttp:request]\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ if (event_rt.rlist[route_no]==0)
|
|
|
+ {
|
|
|
+ LM_WARN("event_route[xhttp:request] is empty\n");
|
|
|
+ }
|
|
|
+ xhttp_route_no=route_no;
|
|
|
}
|
|
|
- xhttp_route_no=route_no;
|
|
|
|
|
|
/* bind the SL API */
|
|
|
if (sl_load_api(&slb)!=0) {
|
|
@@ -241,10 +253,14 @@ static int xhttp_process_request(sip_msg_t* orig_msg,
|
|
|
char* new_buf, unsigned int new_len)
|
|
|
{
|
|
|
int ret;
|
|
|
+ int backup_rt;
|
|
|
sip_msg_t tmp_msg, *msg;
|
|
|
struct run_act_ctx ra_ctx;
|
|
|
-
|
|
|
+ sr_kemi_eng_t *keng = NULL;
|
|
|
+ str evrtname = str_init("xhttp:request");
|
|
|
+
|
|
|
ret=0;
|
|
|
+ backup_rt = get_route_type();
|
|
|
if (new_buf && new_len)
|
|
|
{
|
|
|
memset(&tmp_msg, 0, sizeof(sip_msg_t));
|
|
@@ -270,17 +286,31 @@ static int xhttp_process_request(sip_msg_t* orig_msg,
|
|
|
LM_CRIT("strange message: %.*s\n", msg->len, msg->buf);
|
|
|
goto error;
|
|
|
}
|
|
|
+
|
|
|
+ set_route_type(EVENT_ROUTE);
|
|
|
if (exec_pre_script_cb(msg, REQUEST_CB_TYPE) == 0)
|
|
|
{
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
init_run_actions_ctx(&ra_ctx);
|
|
|
- if (run_actions(&ra_ctx, event_rt.rlist[xhttp_route_no], msg) < 0)
|
|
|
- {
|
|
|
- ret=-1;
|
|
|
- LM_DBG("error while trying script\n");
|
|
|
- goto done;
|
|
|
+ if(xhttp_route_no>=0) {
|
|
|
+ if (run_actions(&ra_ctx, event_rt.rlist[xhttp_route_no], msg) < 0)
|
|
|
+ {
|
|
|
+ ret=-1;
|
|
|
+ LM_DBG("error while trying script\n");
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ keng = sr_kemi_eng_get();
|
|
|
+ if(keng!=NULL) {
|
|
|
+ if(keng->froute(msg, EVENT_ROUTE,
|
|
|
+ &xhttp_event_callback, &evrtname)<0) {
|
|
|
+ LM_ERR("error running event route kemi callback\n");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ LM_ERR("no event route or kemi callback found for execution\n");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
done:
|
|
@@ -289,6 +319,7 @@ done:
|
|
|
{
|
|
|
free_sip_msg(msg);
|
|
|
}
|
|
|
+ set_route_type(backup_rt);
|
|
|
return ret;
|
|
|
|
|
|
error:
|
|
@@ -538,4 +569,4 @@ int mod_register(char *path, int *dlflags, void *p1, void *p2)
|
|
|
return register_trans_mod(path, mod_trans);
|
|
|
}
|
|
|
|
|
|
-/** @} */
|
|
|
+/** @} */
|