소스 검색

topos: restore headers on receiving response

Daniel-Constantin Mierla 9 년 전
부모
커밋
9b4c0c2931
2개의 변경된 파일96개의 추가작업 그리고 30개의 파일을 삭제
  1. 50 1
      modules/topos/tps_msg.c
  2. 46 29
      modules/topos/tps_storage.c

+ 50 - 1
modules/topos/tps_msg.c

@@ -132,6 +132,9 @@ int tps_add_headers(sip_msg_t *msg, str *hname, str *hbody, int hpos)
 	struct lump* anchor;
 	str hs;
 
+	if(hname==NULL || hname->len<=0 || hbody==NULL || hbody->len<=0)
+		return 0;
+
 	parse_headers(msg, HDR_EOH_F, 0);
 	if(hpos == 0) { /* append */
 		/* after last header */
@@ -405,9 +408,11 @@ int tps_pack_request(sip_msg_t *msg, tps_data_t *ptsd)
 	LM_DBG("compacted headers - as_contact: [%.*s](%d) - bs_contact: [%.*s](%d)\n",
 			ptsd->as_contact.len, ZSW(ptsd->as_contact.s), ptsd->as_contact.len,
 			ptsd->bs_contact.len, ZSW(ptsd->bs_contact.s), ptsd->bs_contact.len);
+	ptsd->x_rr = ptsd->a_rr;
 	return 0;
 }
 
+
 /**
  *
  */
@@ -436,6 +441,34 @@ int tps_reinsert_contact(sip_msg_t *msg, tps_data_t *ptsd, str *hbody)
 	return 0;
 }
 
+/**
+ *
+ */
+int tps_reappend_via(sip_msg_t *msg, tps_data_t *ptsd, str *hbody)
+{
+	str hname = str_init("Via");
+
+	if(tps_add_headers(msg, &hname, hbody, 0)<0) {
+		return -1;
+	}
+
+	return 0;
+}
+
+/**
+ *
+ */
+int tps_reappend_rr(sip_msg_t *msg, tps_data_t *ptsd, str *hbody)
+{
+	str hname = str_init("Record-Route");
+
+	if(tps_add_headers(msg, &hname, hbody, 0)<0) {
+		return -1;
+	}
+
+	return 0;
+}
+
 /**
  *
  */
@@ -455,24 +488,40 @@ int tps_response_received(sip_msg_t *msg)
 {
 	tps_data_t mtsd;
 	tps_data_t stsd;
+	tps_data_t btsd;
 	tps_data_t *ptsd;
 	str lkey;
 
 	memset(&mtsd, 0, sizeof(tps_data_t));
 	memset(&stsd, 0, sizeof(tps_data_t));
+	memset(&btsd, 0, sizeof(tps_data_t));
 	ptsd = &mtsd;
 
+	lkey = msg->callid->body;
+
 	if(tps_pack_request(msg, &mtsd)<0) {
 		LM_ERR("failed to extract and pack the headers\n");
 		return -1;
 	}
-	if(tps_storage_load_dialog(msg, &mtsd, &stsd)<0) {
+	tps_storage_lock_get(&lkey);
+	if(tps_storage_load_branch(msg, &mtsd, &btsd)<0) {
+		goto error;
+	}
+	LM_DBG("loaded dialog a_uuid [%.*s]\n",
+			btsd.a_uuid.len, ZSW(btsd.a_uuid.s));
+	if(tps_storage_load_dialog(msg, &btsd, &stsd)<0) {
 		goto error;
 	}
 
+	tps_storage_lock_release(&lkey);
+
+	tps_reappend_via(msg, &btsd, &btsd.x_via);
+	tps_reappend_rr(msg, &btsd, &btsd.x_rr);
+
 	return 0;
 
 error:
+	tps_storage_lock_release(&lkey);
 	return -1;
 }
 

+ 46 - 29
modules/topos/tps_storage.c

@@ -557,14 +557,24 @@ int tps_db_insert_branch(tps_data_t *td)
 	db_vals[nr_keys].val.str_val = TPS_STRZ(td->x_via);
 	nr_keys++;
 
-	db_keys[nr_keys] = &tt_col_x_tag;
+	db_keys[nr_keys] = &tt_col_x_vbranch;
 	db_vals[nr_keys].type = DB1_STR;
-	db_vals[nr_keys].val.str_val = TPS_STRZ(td->x_tag);
+	db_vals[nr_keys].val.str_val = TPS_STRZ(td->x_vbranch1);
 	nr_keys++;
 
-	db_keys[nr_keys] = &tt_col_x_vbranch;
+	db_keys[nr_keys] = &tt_col_x_rr;
 	db_vals[nr_keys].type = DB1_STR;
-	db_vals[nr_keys].val.str_val = TPS_STRZ(td->x_vbranch1);
+	db_vals[nr_keys].val.str_val = TPS_STRZ(td->x_rr);
+	nr_keys++;
+
+	db_keys[nr_keys] = &tt_col_x_uri;
+	db_vals[nr_keys].type = DB1_STR;
+	db_vals[nr_keys].val.str_val = TPS_STRZ(td->x_uri);
+	nr_keys++;
+
+	db_keys[nr_keys] = &tt_col_x_tag;
+	db_vals[nr_keys].type = DB1_STR;
+	db_vals[nr_keys].val.str_val = TPS_STRZ(td->x_tag);
 	nr_keys++;
 
 	if (_tpsdbf.use_table(_tps_db_handle, &tt_table_name) < 0) {
@@ -615,6 +625,9 @@ int tps_db_clean_branches(void)
 	return 0;
 }
 
+/**
+ *
+ */
 #define TPS_DATA_APPEND_DB(_sd, _res, _c, _s)	\
 	do { \
 		if (RES_ROWS(_res)[0].values[_c].nul == 0) \
@@ -624,7 +637,11 @@ int tps_db_clean_branches(void)
 			{ \
 			case DB1_STRING: \
 				tmp.s=(char*)RES_ROWS(_res)[0].values[_c].val.string_val; \
-				tmp.len=strlen(tmp.s); \
+				if(tmp.s) { \
+					tmp.len=strlen(tmp.s); \
+				} else { \
+					tmp.len=0; \
+				} \
 				break; \
 			case DB1_STR: \
 				tmp.len=RES_ROWS(_res)[0].values[_c].val.str_val.len; \
@@ -712,15 +729,15 @@ int tps_storage_load_branch(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
 
 	n = 0;
 	n++; /*rectime*/
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->a_callid);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->a_uuid);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->b_uuid);
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->a_callid); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->a_uuid); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->b_uuid); n++;
 	n++; /*direction*/
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->x_via);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->x_vbranch1);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->x_rr);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->x_uri);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->x_tag);
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->x_via); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->x_vbranch1); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->x_rr); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->x_uri); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->x_tag); n++;
 
 	if ((db_res!=NULL) && _tpsdbf.free_result(_tps_db_handle, db_res)<0)
 		LM_ERR("failed to free result of query\n");
@@ -802,23 +819,23 @@ int tps_storage_load_dialog(sip_msg_t *msg, tps_data_t *md, tps_data_t *sd)
 
 	n = 0;
 	n++; /*rectime*/
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->a_callid);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->a_uuid);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->b_uuid);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->a_contact);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->b_contact);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->as_contact);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->bs_contact);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->a_tag);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->b_tag);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->a_rr);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->b_rr);
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->a_callid); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->a_uuid); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->b_uuid); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->a_contact); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->b_contact); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->as_contact); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->bs_contact); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->a_tag); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->b_tag); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->a_rr); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->b_rr); n++;
 	n++; /*iflags*/
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->a_uri);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->b_uri);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->r_uri);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->a_srcip);
-	TPS_DATA_APPEND_DB(sd, db_res, n++, &sd->b_srcip);
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->a_uri); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->b_uri); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->r_uri); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->a_srcip); n++;
+	TPS_DATA_APPEND_DB(sd, db_res, n, &sd->b_srcip); n++;
 
 	if ((db_res!=NULL) && _tpsdbf.free_result(_tps_db_handle, db_res)<0)
 		LM_ERR("failed to free result of query\n");