From 1adcebb309cba22a2558012d8a800ba2a8cd2308 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Wed, 10 Feb 2021 21:16:41 -0500 Subject: [PATCH] [mod_sofia] add sip_refer_continue_after_reply channel variable. Set to true to prevent hangup when response to REFER request is received. Added sip_refer_target_status_code and sip_refer_target_provisional_status_code channel variables to store responses from NOTIFY sipfrags. --- src/mod/endpoints/mod_sofia/mod_sofia.c | 2 +- src/mod/endpoints/mod_sofia/sofia.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 835717e7e9..5de26b1d00 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1553,7 +1553,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi if (msg->string_array_arg[0]) { tech_pvt->proxy_refer_uuid = (char *)msg->string_array_arg[0]; - } else { + } else if (!switch_channel_var_true(tech_pvt->channel, "sip_refer_continue_after_reply")) { switch_mutex_unlock(tech_pvt->sofia_mutex); sofia_wait_for_reply(tech_pvt, 9999, 10); switch_mutex_lock(tech_pvt->sofia_mutex); diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index bb5b969552..6e6bce2827 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -679,13 +679,16 @@ void sofia_handle_sip_i_notify(switch_core_session_t *session, int status, status_val = atoi(p); } if (!status_val || status_val >= 200) { + switch_channel_set_variable_printf(channel, "sip_refer_target_status_code", "%d", status_val); switch_channel_set_variable(channel, "sip_refer_reply", sip->sip_payload->pl_data); - if (status_val == 200) { + if (status_val == 200 && !switch_channel_var_true(channel, "sip_refer_continue_after_reply")) { switch_channel_hangup(channel, SWITCH_CAUSE_BLIND_TRANSFER); } if ((int)tech_pvt->want_event == 9999) { tech_pvt->want_event = 0; } + } else if (status_val < 200) { + switch_channel_set_variable_printf(channel, "sip_refer_target_provisional_status_code", "%d", status_val); } } }