Module: sip-router Branch: master Commit: 497ded52eaafd7a43520dee41910efa85ef042c4 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=497ded52...
Author: Richard Good richard.good@smilecoms.com Committer: Richard Good richard.good@smilecoms.com Date: Mon Mar 10 14:28:32 2014 +0200
lib/ims: added new function to get contact from request uri
---
lib/ims/ims_getters.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/ims/ims_getters.h | 11 +++++++++ 2 files changed, 67 insertions(+), 0 deletions(-)
diff --git a/lib/ims/ims_getters.c b/lib/ims/ims_getters.c index eb266e8..a026e53 100644 --- a/lib/ims/ims_getters.c +++ b/lib/ims/ims_getters.c @@ -315,6 +315,62 @@ str cscf_get_public_identity_from_requri(struct sip_msg *msg) }
/** + * Get the contact from the Request URI of the message + * NB: free returned result str when done from shm + * @param msg - the SIP message + * @returns the contact (don't forget to free from shm) + * + * NOTE: should only be called when REQ URI has been converted sip:user@IP_ADDRESS:PORT or tel:IP_ADDRESS:PORT + */ +str cscf_get_contact_from_requri(struct sip_msg *msg) +{ + str pu={0,0}; + + if (msg->first_line.type!=SIP_REQUEST) { + return pu; + } + if (parse_sip_msg_uri(msg)<0){ + return pu; + } + if(!msg->parsed_uri.port.len){ + return pu; + } + + if(msg->parsed_uri.type==TEL_URI_T){ + pu.len = 4 + msg->parsed_uri.user.len + msg->parsed_uri.port.len + 1 /*for colon before port*/; + pu.s = shm_malloc(pu.len+1); + if (!pu.s){ + LM_ERR("cscf_get_public_identity_from_requri: Error allocating %d bytes\n", pu.len + 1); + pu.len = 0; + goto done; + } + sprintf(pu.s,"tel:%.*s:%.*s", + msg->parsed_uri.user.len, + msg->parsed_uri.user.s, + msg->parsed_uri.port.len, + msg->parsed_uri.port.s); + }else{ + pu.len = 4 + msg->parsed_uri.user.len + 1/*for @*/ + msg->parsed_uri.host.len + msg->parsed_uri.port.len + 1 /*for colon before port*/; + pu.s = shm_malloc(pu.len+1); + if (!pu.s){ + LM_ERR("cscf_get_public_identity_from_requri: Error allocating %d bytes\n", pu.len + 1); + pu.len = 0; + goto done; + } + sprintf(pu.s,"sip:%.*s@%.*s:%.*s", + msg->parsed_uri.user.len, + msg->parsed_uri.user.s, + msg->parsed_uri.host.len, + msg->parsed_uri.host.s, + msg->parsed_uri.port.len, + msg->parsed_uri.port.s); + } + + done: + return pu; +} + +/** * Finds if the message contains the orig parameter in the first Route header * @param msg - the SIP message * @param str1 - not used diff --git a/lib/ims/ims_getters.h b/lib/ims/ims_getters.h index aeeb591..0111c0a 100644 --- a/lib/ims/ims_getters.h +++ b/lib/ims/ims_getters.h @@ -177,6 +177,17 @@ str cscf_get_realm_from_ruri(struct sip_msg *msg); * @returns the public identity */ str cscf_get_public_identity_from_requri(struct sip_msg *msg); + +/** + * Get the contact from the Request URI of the message + * NB: free returned result str when done from shm + * @param msg - the SIP message + * @returns the contact (don't forget to free from shm) + * + * NOTE: should only be called when REQ URI has been converted sip:user@IP_ADDRESS:PORT or tel:IP_ADDRESS:PORT + */ +str cscf_get_contact_from_requri(struct sip_msg *msg); + /** * Looks for the Call-ID header * @param msg - the sip message