diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 1e82aa7f60..1aa4b174ca 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -7355,7 +7355,7 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_ transport = sofia_glue_url2transport(sip->sip_contact->m_url); - tech_pvt->record_route = + tech_pvt->record_route= switch_core_session_sprintf(session, "sip:%s@%s%s%s:%d;transport=%s", sip->sip_contact->m_url->url_user, @@ -7434,6 +7434,16 @@ void sofia_handle_sip_i_invite(nua_t *nua, sofia_profile_t *profile, nua_handle_ } } + if (sip->sip_record_route) { + char *rr = sip_header_as_string(nh->nh_home, (void *) sip->sip_record_route); + switch_channel_set_variable(channel, "sip_invite_record_route", rr); + } + + if (sip->sip_via) { + char *via = sip_header_as_string(nh->nh_home, (void *) sip->sip_via); + switch_channel_set_variable(channel, "sip_invite_via", via); + } + if ((rpid = sip_remote_party_id(sip))) { if (rpid->rpid_url && rpid->rpid_url->url_user) { char *full_rpid_header = sip_header_as_string(nh->nh_home, (void *) rpid); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 1785f5a9f7..9f09d56b63 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -1941,6 +1941,8 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) sofia_destination_t *dst = NULL; sofia_cid_type_t cid_type = tech_pvt->profile->cid_type; sip_cseq_t *cseq = NULL; + const char *invite_record_route = switch_channel_get_variable(tech_pvt->channel, "sip_invite_record_route"); + const char *invite_via = switch_channel_get_variable(tech_pvt->channel, "sip_invite_via"); const char *invite_full_via = switch_channel_get_variable(tech_pvt->channel, "sip_invite_full_via"); const char *invite_route_uri = switch_channel_get_variable(tech_pvt->channel, "sip_invite_route_uri"); const char *invite_full_from = switch_channel_get_variable(tech_pvt->channel, "sip_invite_full_from"); @@ -1950,7 +1952,20 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) const char *force_full_from = switch_channel_get_variable(tech_pvt->channel, "sip_force_full_from"); const char *force_full_to = switch_channel_get_variable(tech_pvt->channel, "sip_force_full_to"); char *mp = NULL, *mp_type = NULL; + char *record_route = NULL; + + + if (sofia_test_flag(tech_pvt, TFLAG_RECOVERING)) { + if (!zstr(invite_record_route)) { + record_route = switch_core_session_sprintf(session, "Record-Route: %s", invite_record_route); + } + if (!zstr(invite_via)) { + tech_pvt->user_via = switch_core_session_strdup(session, invite_via); + } + } + + rep = switch_channel_get_variable(channel, SOFIA_REPLACES_HEADER); switch_assert(tech_pvt != NULL); @@ -2224,6 +2239,7 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session) if (!(tech_pvt->nh = nua_handle(tech_pvt->profile->nua, NULL, NUTAG_URL(url_str), TAG_IF(call_id, SIPTAG_CALL_ID_STR(call_id)), + TAG_IF(!zstr(record_route), SIPTAG_HEADER_STR(record_route)), SIPTAG_TO_STR(to_str), SIPTAG_FROM_STR(from_str), SIPTAG_CONTACT_STR(invite_contact), TAG_END()))) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT,