diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 1541de9138..216c0b60ac 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -1533,17 +1533,25 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses switch_ivr_park_session(session); } else if ((var = switch_channel_get_variable(caller_channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) { transfer_after_bridge(session, var); - } else if (switch_channel_test_flag(peer_channel, CF_ANSWERED) && - switch_true(switch_channel_get_variable(caller_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE))) { - switch_call_cause_t cause = switch_channel_get_cause(peer_channel); - if (cause == SWITCH_CAUSE_NONE) { - cause = SWITCH_CAUSE_NORMAL_CLEARING; + } else { + const char *hup = switch_channel_get_variable(caller_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE); + int explicit = 0; + + if (hup) { + explicit = !strcasecmp(hup, "explicit"); } - if (switch_channel_test_flag(peer_channel, CF_INTERCEPTED)) { - switch_channel_set_flag(peer_channel, CF_INTERCEPT); + if (explicit || (switch_channel_test_flag(peer_channel, CF_ANSWERED) && switch_true(hup))) { + switch_call_cause_t cause = switch_channel_get_cause(peer_channel); + if (cause == SWITCH_CAUSE_NONE) { + cause = SWITCH_CAUSE_NORMAL_CLEARING; + } + + if (switch_channel_test_flag(peer_channel, CF_INTERCEPTED)) { + switch_channel_set_flag(peer_channel, CF_INTERCEPT); + } + switch_channel_hangup(caller_channel, cause); } - switch_channel_hangup(caller_channel, cause); } } }