From 5a6231b6cd83393fe98c03844190886bc2c77f2b Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthm@freeswitch.org>
Date: Thu, 10 Nov 2011 15:16:53 -0600
Subject: [PATCH] FS-3686 try this patch on latest GIT

---
 src/mod/endpoints/mod_sofia/sofia.c      | 12 +++++++++++-
 src/mod/endpoints/mod_sofia/sofia_glue.c | 16 ++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

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,