diff options
author | Benny Prijono <bennylp@teluu.com> | 2010-01-21 17:07:28 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2010-01-21 17:07:28 +0000 |
commit | 3ef2879ba92c2378df917d88069171e7b919c4ef (patch) | |
tree | 86d232c3a00f8994e3fa96e268b42f4570619770 /pjsip | |
parent | 0535be243fddf29f4ab4164cbe1b67d59d59b250 (diff) |
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
Diffstat (limited to 'pjsip')
-rw-r--r-- | pjsip/src/pjsip/sip_util.c | 25 |
1 files 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); |