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:
Benny Prijono 2008-08-05 20:14:39 +00:00
parent 984080bd69
commit a330d4553a
8 changed files with 190 additions and 12 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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*)
pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT,
NULL);
/* 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,
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;

View File

@ -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 */
h_contact = (pjsip_contact_hdr*)
pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT,
NULL);
if (h_contact)
uri = (pjsip_uri*) pjsip_uri_get_uri(h_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,
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

View File

@ -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;
}