瀏覽代碼

tm: generate from tag if not provided for request_within()

- related to GH #931
Daniel-Constantin Mierla 8 年之前
父節點
當前提交
96ca5c95e9
共有 1 個文件被更改,包括 12 次插入0 次删除
  1. 12 0
      src/modules/tm/t_msgbuilder.c

+ 12 - 0
src/modules/tm/t_msgbuilder.c

@@ -1491,11 +1491,20 @@ char* build_uac_req(str* method, str* headers, str* body, dlg_t* dialog,
 	str content_length, cseq, via;
 	str content_length, cseq, via;
 	unsigned int maxfwd_len;
 	unsigned int maxfwd_len;
 	int tbracket, fbracket;
 	int tbracket, fbracket;
+	str fromtag = STR_NULL;
+	str loc_tag = STR_NULL;
 
 
 	if (!method || !dialog) {
 	if (!method || !dialog) {
 		LM_ERR("invalid parameter value\n");
 		LM_ERR("invalid parameter value\n");
 		return 0;
 		return 0;
 	}
 	}
+
+	if (dialog->id.loc_tag.len<=0) {
+		/* From Tag is mandatory in RFC3261 - generate one if not provided */
+		generate_fromtag(&fromtag, &dialog->id.call_id);
+		loc_tag = dialog->id.loc_tag;
+		dialog->id.loc_tag = fromtag;
+	}
 	if (print_content_length(&content_length, body) < 0) {
 	if (print_content_length(&content_length, body) < 0) {
 		LM_ERR("error while printing content-length\n");
 		LM_ERR("error while printing content-length\n");
 		return 0;
 		return 0;
@@ -1580,6 +1589,9 @@ char* build_uac_req(str* method, str* headers, str* body, dlg_t* dialog,
 	memapp(w, via.s, via.len);                            /* Top-most Via */
 	memapp(w, via.s, via.len);                            /* Top-most Via */
 	w = print_to(w, dialog, t, tbracket);                 /* To */
 	w = print_to(w, dialog, t, tbracket);                 /* To */
 	w = print_from(w, dialog, t, fbracket);               /* From */
 	w = print_from(w, dialog, t, fbracket);               /* From */
+	if(fromtag.len>0) {
+		dialog->id.loc_tag = loc_tag;
+	}
 	w = print_cseq(w, &cseq, method, t);                  /* CSeq */
 	w = print_cseq(w, &cseq, method, t);                  /* CSeq */
 	w = print_callid(w, dialog, t);                       /* Call-ID */
 	w = print_callid(w, dialog, t);                       /* Call-ID */
 	w = print_routeset(w, dialog);                        /* Route set */
 	w = print_routeset(w, dialog);                        /* Route set */