Ticket #585: Handle non-SIP URI in Contact header of incoming INVITE and SUBSCRIBE requests
git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@2194 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
parent
984080bd69
commit
a330d4553a
|
@ -0,0 +1,27 @@
|
|||
# $Id:$
|
||||
import inc_sip as sip
|
||||
import inc_sdp as sdp
|
||||
|
||||
# Some non-SIP URI's in Contact header
|
||||
#
|
||||
complete_msg = \
|
||||
"""INVITE sip:localhost SIP/2.0
|
||||
Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9
|
||||
Max-Forwards: 70
|
||||
From: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
|
||||
To: <sip:localhost>
|
||||
Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
|
||||
CSeq: 0 INVITE
|
||||
Contact: mailto:dontspam@pjsip.org
|
||||
Contact: <mailto:dontspam@pjsip.org>
|
||||
Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue
|
||||
Contact: <sip:localhost>
|
||||
User-Agent: PJSUA v0.9.0-trunk/win32
|
||||
Content-Length: 0
|
||||
"""
|
||||
|
||||
|
||||
sendto_cfg = sip.SendtoCfg( "Non SIP URI in Contact",
|
||||
"--null-audio --auto-answer 200",
|
||||
"", 200, complete_msg=complete_msg)
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
# $Id:$
|
||||
import inc_sip as sip
|
||||
import inc_sdp as sdp
|
||||
|
||||
# No SIP URI in Contact header
|
||||
#
|
||||
complete_msg = \
|
||||
"""INVITE sip:localhost SIP/2.0
|
||||
Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9
|
||||
Max-Forwards: 70
|
||||
From: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
|
||||
To: <sip:localhost>
|
||||
Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
|
||||
CSeq: 0 INVITE
|
||||
Contact: mailto:dontspam@pjsip.org
|
||||
Contact: <mailto:dontspam@pjsip.org>
|
||||
Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue
|
||||
User-Agent: PJSUA v0.9.0-trunk/win32
|
||||
Content-Length: 0
|
||||
"""
|
||||
|
||||
|
||||
sendto_cfg = sip.SendtoCfg( "No SIP URI in Contact",
|
||||
"--null-audio --auto-answer 200",
|
||||
"", 500, complete_msg=complete_msg)
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
# $Id:$
|
||||
import inc_sip as sip
|
||||
import inc_sdp as sdp
|
||||
|
||||
# Some non-SIP URI's in Contact header
|
||||
#
|
||||
complete_msg = \
|
||||
"""INVITE sip:localhost SIP/2.0
|
||||
Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9
|
||||
Max-Forwards: 70
|
||||
From: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
|
||||
To: <sip:localhost>
|
||||
Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
|
||||
CSeq: 0 INVITE
|
||||
Contact: <sip:localhost>
|
||||
Contact: mailto:dontspam@pjsip.org
|
||||
Contact: <mailto:dontspam@pjsip.org>
|
||||
Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue
|
||||
User-Agent: PJSUA v0.9.0-trunk/win32
|
||||
Content-Length: 0
|
||||
"""
|
||||
|
||||
|
||||
sendto_cfg = sip.SendtoCfg( "Non SIP URI in Contact",
|
||||
"--null-audio --auto-answer 200",
|
||||
"", 200, complete_msg=complete_msg)
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
# $Id:$
|
||||
import inc_sip as sip
|
||||
import inc_sdp as sdp
|
||||
|
||||
# Some non-SIP URI's in Contact header
|
||||
#
|
||||
complete_msg = \
|
||||
"""SUBSCRIBE sip:localhost SIP/2.0
|
||||
Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9
|
||||
Max-Forwards: 70
|
||||
From: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
|
||||
To: <sip:localhost>
|
||||
Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
|
||||
CSeq: 0 SUBSCRIBE
|
||||
Contact: mailto:dontspam@pjsip.org
|
||||
Contact: <mailto:dontspam@pjsip.org>
|
||||
Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue
|
||||
Contact: <sip:localhost>
|
||||
Event: presence
|
||||
Expires: 600
|
||||
Accept: application/pidf+xml, application/xpidf+xml
|
||||
Allow-Events: presence, refer
|
||||
User-Agent: PJSUA v0.9.0-trunk/win32
|
||||
Content-Length: 0
|
||||
"""
|
||||
|
||||
|
||||
sendto_cfg = sip.SendtoCfg( "Non SIP URI in Contact",
|
||||
"--null-audio --auto-answer 200",
|
||||
"", 200, complete_msg=complete_msg)
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
# $Id:$
|
||||
import inc_sip as sip
|
||||
import inc_sdp as sdp
|
||||
|
||||
# Some non-SIP URI's in Contact header
|
||||
#
|
||||
complete_msg = \
|
||||
"""SUBSCRIBE sip:localhost SIP/2.0
|
||||
Via: SIP/2.0/UDP 192.168.0.14:5060;rport;branch=z9hG4bKPj9db9
|
||||
Max-Forwards: 70
|
||||
From: <sip:192.168.0.14>;tag=08cd5bfc2d8a4fddb1f5e59c6961d298
|
||||
To: <sip:localhost>
|
||||
Call-ID: 3373d9eb32aa458db7e69c7ea51e0bd7
|
||||
CSeq: 0 SUBSCRIBE
|
||||
Contact: mailto:dontspam@pjsip.org
|
||||
Contact: <mailto:dontspam@pjsip.org>
|
||||
Contact: http://www.pjsip.org/the%20path.cgi?pname=pvalue
|
||||
Event: presence
|
||||
Expires: 600
|
||||
Accept: application/pidf+xml, application/xpidf+xml
|
||||
Allow-Events: presence, refer
|
||||
User-Agent: PJSUA v0.9.0-trunk/win32
|
||||
Content-Length: 0
|
||||
"""
|
||||
|
||||
|
||||
sendto_cfg = sip.SendtoCfg( "Non SIP URI in Contact",
|
||||
"--null-audio --auto-answer 200",
|
||||
"", 400, complete_msg=complete_msg)
|
||||
|
|
@ -307,7 +307,8 @@ PJ_DEF(pj_status_t) pjsip_dlg_create_uas( pjsip_user_agent *ua,
|
|||
pjsip_dialog **p_dlg)
|
||||
{
|
||||
pj_status_t status;
|
||||
pjsip_hdr *contact_hdr;
|
||||
pjsip_hdr *pos = NULL;
|
||||
pjsip_contact_hdr *contact_hdr;
|
||||
pjsip_rr_hdr *rr;
|
||||
pjsip_transaction *tsx = NULL;
|
||||
pj_str_t tmp;
|
||||
|
@ -416,16 +417,33 @@ PJ_DEF(pj_status_t) pjsip_dlg_create_uas( pjsip_user_agent *ua,
|
|||
pj_strdup(dlg->pool, &dlg->remote.info_str, &tmp);
|
||||
|
||||
|
||||
/* Init remote's contact from Contact header. */
|
||||
contact_hdr = (pjsip_hdr*)
|
||||
/* Init remote's contact from Contact header.
|
||||
* Iterate the Contact URI until we find sip: or sips: scheme.
|
||||
*/
|
||||
do {
|
||||
contact_hdr = (pjsip_contact_hdr*)
|
||||
pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT,
|
||||
NULL);
|
||||
pos);
|
||||
if (contact_hdr) {
|
||||
if (!PJSIP_URI_SCHEME_IS_SIP(contact_hdr->uri) &&
|
||||
!PJSIP_URI_SCHEME_IS_SIPS(contact_hdr->uri))
|
||||
{
|
||||
pos = (pjsip_hdr*)contact_hdr->next;
|
||||
if (pos == &rdata->msg_info.msg->hdr)
|
||||
contact_hdr = NULL;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (contact_hdr);
|
||||
|
||||
if (!contact_hdr) {
|
||||
status = PJSIP_ERRNO_FROM_SIP_STATUS(PJSIP_SC_BAD_REQUEST);
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
dlg->remote.contact = (pjsip_contact_hdr*)
|
||||
pjsip_hdr_clone(dlg->pool, contact_hdr);
|
||||
pjsip_hdr_clone(dlg->pool, (pjsip_hdr*)contact_hdr);
|
||||
|
||||
/* Init remote's CSeq from CSeq header */
|
||||
dlg->remote.cseq = dlg->remote.first_cseq = rdata->msg_info.cseq->cseq;
|
||||
|
|
|
@ -1674,15 +1674,30 @@ PJ_DEF(pj_status_t) pjsua_acc_create_uas_contact( pj_pool_t *pool,
|
|||
sip_uri = (pjsip_sip_uri*)
|
||||
pjsip_uri_get_uri(rdata->msg_info.record_route->name_addr.uri);
|
||||
} else {
|
||||
pjsip_hdr *pos = NULL;
|
||||
pjsip_contact_hdr *h_contact;
|
||||
pjsip_uri *uri = NULL;
|
||||
|
||||
/* Otherwise URI is Contact URI */
|
||||
/* Otherwise URI is Contact URI.
|
||||
* Iterate the Contact URI until we find sip: or sips: scheme.
|
||||
*/
|
||||
do {
|
||||
h_contact = (pjsip_contact_hdr*)
|
||||
pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT,
|
||||
NULL);
|
||||
if (h_contact)
|
||||
pos);
|
||||
if (h_contact) {
|
||||
uri = (pjsip_uri*) pjsip_uri_get_uri(h_contact->uri);
|
||||
if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&
|
||||
!PJSIP_URI_SCHEME_IS_SIPS(uri))
|
||||
{
|
||||
pos = (pjsip_hdr*)h_contact->next;
|
||||
if (pos == &rdata->msg_info.msg->hdr)
|
||||
h_contact = NULL;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (h_contact);
|
||||
|
||||
|
||||
/* Or if Contact URI is not present, take the remote URI from
|
||||
|
|
|
@ -688,6 +688,8 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
|
|||
pjsua_perror(THIS_FILE, "Unable to generate Contact header",
|
||||
status);
|
||||
PJSUA_UNLOCK();
|
||||
pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 400, NULL,
|
||||
NULL, NULL);
|
||||
return PJ_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -700,6 +702,8 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata)
|
|||
"Unable to create UAS dialog for subscription",
|
||||
status);
|
||||
PJSUA_UNLOCK();
|
||||
pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 400, NULL,
|
||||
NULL, NULL);
|
||||
return PJ_TRUE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue