Sfoglia il codice sorgente

topos: record routing storage for handling sip responses

Daniel-Constantin Mierla 9 anni fa
parent
commit
24a792d23c
1 ha cambiato i file con 69 aggiunte e 50 eliminazioni
  1. 69 50
      modules/topos/tps_msg.c

+ 69 - 50
modules/topos/tps_msg.c

@@ -296,6 +296,7 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd)
 	int i;
 	int vlen;
 	int r2;
+	int isreq;
 
 	if(ptsd->cp==NULL) {
 		ptsd->cp = ptsd->cbuf;
@@ -344,6 +345,7 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd)
 	ptsd->s_rr.len = 0;
 	i = 0;
 	r2 = 0;
+	isreq = (msg->first_line.type==SIP_REQUEST)?1:0;
 	for(hdr=msg->record_route; hdr; hdr=next_sibling_hdr(hdr)) {
 		if (parse_rr(hdr) < 0) {
 			LM_ERR("failed to parse RR\n");
@@ -356,67 +358,84 @@ int tps_pack_message(sip_msg_t *msg, tps_data_t *ptsd)
 				LM_ERR("no more spage to pack rr headers\n");
 				return -1;
 			}
-			if(i>1) {
-				if(i==2 &&r2==0) {
-					ptsd->s_rr.len = ptsd->a_rr.len;
+			if(isreq==1) {
+				/* sip request - get a+s-side record route */
+				if(i>1) {
+					if(i==2 &&r2==0) {
+						ptsd->s_rr.len = ptsd->a_rr.len;
+					}
+					if(i==3 &&r2==1) {
+						ptsd->s_rr.len = ptsd->a_rr.len;
+					}
+					*ptsd->cp = ',';
+					ptsd->cp++;
+					ptsd->a_rr.len++;
 				}
-				if(i==3 &&r2==1) {
-					ptsd->s_rr.len = ptsd->a_rr.len;
+				*ptsd->cp = '<';
+				if(i==1) {
+					ptsd->a_rr.s = ptsd->cp;
+					ptsd->s_rr.s = ptsd->cp;
 				}
-				*ptsd->cp = ',';
+				if(i==2 && r2==0) {
+					ptsd->a_rr.s = ptsd->cp;
+					ptsd->a_rr.len = 0;
+				}
+				if(i==3 && r2==1) {
+					ptsd->a_rr.s = ptsd->cp;
+					ptsd->a_rr.len = 0;
+				}
+
 				ptsd->cp++;
 				ptsd->a_rr.len++;
-			}
-			*ptsd->cp = '<';
-			if(i==1) {
-				ptsd->a_rr.s = ptsd->cp;
-				ptsd->s_rr.s = ptsd->cp;
-			}
-			if(i==2 && r2==0) {
-				ptsd->a_rr.s = ptsd->cp;
-				ptsd->a_rr.len = 0;
-			}
-			if(i==3 && r2==1) {
-				ptsd->a_rr.s = ptsd->cp;
-				ptsd->a_rr.len = 0;
-			}
 
-			ptsd->cp++;
-			ptsd->a_rr.len++;
-
-			memcpy(ptsd->cp, rr->nameaddr.uri.s, rr->nameaddr.uri.len);
-			if(i==1) {
-				ptsd->bs_contact.s = ptsd->cp;
-				ptsd->bs_contact.len = rr->nameaddr.uri.len;
-				if(_strnstr(ptsd->bs_contact.s, ";r2=on",
-							ptsd->bs_contact.len)==0) {
-					LM_DBG("single record routing by proxy\n");
-					ptsd->as_contact.s = ptsd->cp;
-					ptsd->as_contact.len = rr->nameaddr.uri.len;
+				memcpy(ptsd->cp, rr->nameaddr.uri.s, rr->nameaddr.uri.len);
+				if(i==1) {
+					ptsd->bs_contact.s = ptsd->cp;
+					ptsd->bs_contact.len = rr->nameaddr.uri.len;
+					if(_strnstr(ptsd->bs_contact.s, ";r2=on",
+								ptsd->bs_contact.len)==0) {
+						LM_DBG("single record routing by proxy\n");
+						ptsd->as_contact.s = ptsd->cp;
+						ptsd->as_contact.len = rr->nameaddr.uri.len;
+					} else {
+						r2 = 1;
+					}
 				} else {
-					r2 = 1;
+					if(i==2 && ptsd->as_contact.len==0) {
+						LM_DBG("double record routing by proxy\n");
+						ptsd->as_contact.s = ptsd->cp;
+						ptsd->as_contact.len = rr->nameaddr.uri.len;
+					}
 				}
+				ptsd->a_rr.len += rr->nameaddr.uri.len;
+				ptsd->cp += rr->nameaddr.uri.len;
+				*ptsd->cp = '>';
+				ptsd->cp++;
+				ptsd->a_rr.len++;
 			} else {
-				if(i==2 && ptsd->as_contact.len==0) {
-					LM_DBG("double record routing by proxy\n");
-					ptsd->as_contact.s = ptsd->cp;
-					ptsd->as_contact.len = rr->nameaddr.uri.len;
-				}
+				/* sip response - get b-side record route */
+				*ptsd->cp = '<';
+				ptsd->b_rr.s = ptsd->cp;
+				ptsd->cp++;
+				ptsd->b_rr.len++;
+				memcpy(ptsd->cp, rr->nameaddr.uri.s, rr->nameaddr.uri.len);
+				ptsd->cp += rr->nameaddr.uri.len;
+				ptsd->b_rr.len += rr->nameaddr.uri.len;
+				*ptsd->cp = '>';
+				ptsd->cp++;
+				ptsd->b_rr.len++;
 			}
-			ptsd->a_rr.len += rr->nameaddr.uri.len;
-			ptsd->cp += rr->nameaddr.uri.len;
-			*ptsd->cp = '>';
-			ptsd->cp++;
-			ptsd->a_rr.len++;
 		}
 	}
-	if(i==1) {
-		ptsd->s_rr.len = ptsd->a_rr.len;
-		ptsd->a_rr.len = 0;
-	}
-	if(i==2 && r2==1) {
-		ptsd->s_rr.len = ptsd->a_rr.len;
-		ptsd->a_rr.len = 0;
+	if(isreq==1) {
+		if(i==1) {
+			ptsd->s_rr.len = ptsd->a_rr.len;
+			ptsd->a_rr.len = 0;
+		}
+		if(i==2 && r2==1) {
+			ptsd->s_rr.len = ptsd->a_rr.len;
+			ptsd->a_rr.len = 0;
+		}
 	}
 	LM_DBG("compacted headers - a_rr: [%.*s](%d) - b_rr: [%.*s](%d)"
 			" - s_rr: [%.*s](%d)\n",