[svn-commits] oej: trunk r46275 - /trunk/channels/chan_sip.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Wed Oct 25 13:12:07 MST 2006


Author: oej
Date: Wed Oct 25 15:12:06 2006
New Revision: 46275

URL: http://svn.digium.com/view/asterisk?rev=46275&view=rev
Log:
First stab at transaction direction fix, this for trunk for testing

Modified:
    trunk/channels/chan_sip.c

Modified: trunk/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_sip.c?rev=46275&r1=46274&r2=46275&view=diff
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Wed Oct 25 15:12:06 2006
@@ -5546,6 +5546,7 @@
 	const char *c;
 	const char *ot, *of;
 	int is_strict = FALSE;		/*!< Strict routing flag */
+	int is_outbound = ast_test_flag(&p->flags[0], SIP_OUTGOING);	/* Session direction */
 
 	memset(req, 0, sizeof(struct sip_request));
 	
@@ -5567,6 +5568,14 @@
 		if (sipdebug)
 			ast_log(LOG_DEBUG, "Strict routing enforced for session %s\n", p->callid);
 	}
+	
+	/* Let's try to figure out the direction of this transaction within the dialog */
+	/* If we're sending an ACK, we DID send the INVITE - which means outbound.
+	   INVITE's are outbound transactions, always 
+	*/
+	if (sipmethod == SIP_ACK || sipmethod == SIP_INVITE)
+		is_outbound = TRUE;
+	/* In other case's, let's follow the flow of the dialog */
 
 	if (sipmethod == SIP_CANCEL)
 		c = p->initreq.rlPart2;	/* Use original URI */
@@ -5584,7 +5593,7 @@
 	else {
 		char *n;
 		/* We have no URI, use To: or From:  header as URI (depending on direction) */
-		ast_copy_string(stripped, get_header(orig, (ast_test_flag(&p->flags[0], SIP_OUTGOING)) ? "To" : "From"),
+		ast_copy_string(stripped, get_header(orig, is_outbound ? "To" : "From"),
 				sizeof(stripped));
 		n = get_in_brackets(stripped);
 		c = strsep(&n, ";");	/* trim ; and beyond */
@@ -5607,16 +5616,16 @@
 	if (!strcasestr(ot, "tag=") && sipmethod != SIP_CANCEL) {
 		/* Add the proper tag if we don't have it already.  If they have specified
 		   their tag, use it.  Otherwise, use our own tag */
-		if (ast_test_flag(&p->flags[0], SIP_OUTGOING) && !ast_strlen_zero(p->theirtag))
+		if (is_outbound && !ast_strlen_zero(p->theirtag))
 			snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->theirtag);
-		else if (!ast_test_flag(&p->flags[0], SIP_OUTGOING))
+		else if (!is_outbound)
 			snprintf(newto, sizeof(newto), "%s;tag=%s", ot, p->tag);
 		else
 			snprintf(newto, sizeof(newto), "%s", ot);
 		ot = newto;
 	}
 
-	if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
+	if (is_outbound) {
 		add_header(req, "From", of);
 		add_header(req, "To", ot);
 	} else {



More information about the svn-commits mailing list