From 3ef2879ba92c2378df917d88069171e7b919c4ef Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Thu, 21 Jan 2010 17:07:28 +0000 Subject: Fixed ticket #1030: Missing To tag in out-of-dialog response (thanks Rui Macedo for the report) git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3069 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsip/sip_util.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/pjsip/src/pjsip/sip_util.c b/pjsip/src/pjsip/sip_util.c index cf3bc929..5bd0f6bf 100644 --- a/pjsip/src/pjsip/sip_util.c +++ b/pjsip/src/pjsip/sip_util.c @@ -485,7 +485,8 @@ PJ_DEF(pj_status_t) pjsip_endpt_create_response( pjsip_endpoint *endpt, pjsip_tx_data *tdata; pjsip_msg *msg, *req_msg; pjsip_hdr *hdr; - pjsip_via_hdr *via; + pjsip_to_hdr *to_hdr; + pjsip_via_hdr *top_via = NULL, *via; pjsip_rr_hdr *rr; pj_status_t status; @@ -527,7 +528,13 @@ PJ_DEF(pj_status_t) pjsip_endpt_create_response( pjsip_endpoint *endpt, /* Copy all the via headers, in order. */ via = rdata->msg_info.via; while (via) { - pjsip_msg_add_hdr( msg, (pjsip_hdr*)pjsip_hdr_clone(tdata->pool, via)); + pjsip_via_hdr *new_via; + + new_via = (pjsip_via_hdr*)pjsip_hdr_clone(tdata->pool, via); + if (top_via == NULL) + top_via = new_via; + + pjsip_msg_add_hdr( msg, (pjsip_hdr*)new_via); via = via->next; if (via != (void*)&req_msg->hdr) via = (pjsip_via_hdr*) @@ -558,8 +565,18 @@ PJ_DEF(pj_status_t) pjsip_endpt_create_response( pjsip_endpoint *endpt, pjsip_msg_add_hdr( msg, hdr); /* Copy To header. */ - hdr = (pjsip_hdr*) pjsip_hdr_clone(tdata->pool, rdata->msg_info.to); - pjsip_msg_add_hdr( msg, hdr); + to_hdr = (pjsip_to_hdr*) pjsip_hdr_clone(tdata->pool, rdata->msg_info.to); + pjsip_msg_add_hdr( msg, (pjsip_hdr*)to_hdr); + + /* Must add To tag in the response (Section 8.2.6.2), except if this is + * 100 (Trying) response. Same tag must be created for the same request + * (e.g. same tag in provisional and final response). The easiest way + * to do this is to derive the tag from Via branch parameter (or to + * use it directly). + */ + if (st_code > 100 && top_via) { + to_hdr->tag = top_via->branch_param; + } /* Copy CSeq header. */ hdr = (pjsip_hdr*) pjsip_hdr_clone(tdata->pool, rdata->msg_info.cseq); -- cgit v1.2.3