On Saturday 06 August 2011 19:44:59 Juha Heinanen wrote:
> if it is possible to somehow determine that ruri of ds has already been
> used by t_relay, it would be possible to patch load contacts so that it
> ignores such a used ruri.

That's what i suggested in my second email in this thread. :)

Anyway, i found the responsible variable and respun the patch, see below.

If this is acceptable, i'll commit this version.



-- 
Alex Hermann
commit 4e831afa89fdb9ef626b5e862b9debbacdcf0c04
Author: Alex Hermann <a...@speakup.nl>
Date:   Mon Aug 1 16:09:38 2011 +0200

    modules/tm: fix t_load_contacts for failure_route
    
    Commit e973bbe5e7310861f77b17ce0afaf1cca35fe48a removed the logic for handling
    failure_route. The result was that when t_load_contacts is called from
    failure_route, the current request-uri is added as branch _again_.
    
    This commit restores the original functionality by ignoreing the request uri
    if it is marked as consumed.

diff --git a/modules/tm/t_serial.c b/modules/tm/t_serial.c
index 899cb5b..bd5ae27 100644
--- a/modules/tm/t_serial.c
+++ b/modules/tm/t_serial.c
@@ -242,15 +242,21 @@ int t_load_contacts(struct sip_msg* msg, char* key, char* value)
     }
 
     ruri = (str *)0;
-
-    /* Take first q from Request-URI */
-    ruri = GET_RURI(msg);
-    if (!ruri) {
-	LM_ERR("no Request-URI found\n");
-	return -1;
+	if (ruri_is_new) {
+		/* Take first q from Request-URI */
+		ruri = GET_RURI(msg);
+		if (!ruri) {
+			LM_ERR("no Request-URI found\n");
+			return -1;
+		}
+		first_q = get_ruri_q();
+		first_idx = 0;
+	} else {
+		/* Take first q from first branch */
+		uri.s = get_branch(0, &uri.len, &first_q, &dst_uri, &path, &flags,
+			               &sock);
+		first_idx = 1;
     }
-    first_q = get_ruri_q();
-    first_idx = 0;
 
     /* Check if all q values are equal */
     for(idx = first_idx; (tmp.s = get_branch(idx, &tmp.len, &q, 0, 0, 0, 0))
@@ -272,15 +278,24 @@ rest:
 		return -1;
     }
 
-    /* Insert Request-URI branch to first contact */
-    contacts->uri.s = ruri->s;
-    contacts->uri.len = ruri->len;
-    contacts->dst_uri = msg->dst_uri;
-    contacts->sock = msg->force_send_socket;
-    getbflagsval(0, &contacts->flags);
-    contacts->path = msg->path_vec;
-    contacts->q = first_q;
-    contacts->next = (struct contact *)0;
+	if (ruri_is_new) {
+		/* Insert Request-URI branch to first contact */
+		contacts->uri.s = ruri->s;
+		contacts->uri.len = ruri->len;
+		contacts->dst_uri = msg->dst_uri;
+		contacts->sock = msg->force_send_socket;
+		getbflagsval(0, &contacts->flags);
+		contacts->path = msg->path_vec;
+	} else {
+		/* Insert first branch to first contact */
+		contacts->uri = uri;
+		contacts->dst_uri = dst_uri;
+		contacts->sock = sock;
+		contacts->flags = flags;
+		contacts->path = path;
+    }
+	contacts->q = first_q;
+	contacts->next = (struct contact *)0;
 
     /* Insert (remaining) branches to contact list in increasing q order */
 
_______________________________________________
sr-dev mailing list
sr-dev@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to