[svn-commits] mmichelson: trunk r431427 - in /trunk: ./ res/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jan 29 15:02:30 CST 2015


Author: mmichelson
Date: Thu Jan 29 15:02:23 2015
New Revision: 431427

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=431427
Log:
Use SIPS URIs in Contact headers when appropriate.

RFC 3261 sections 8.1.1.8 and 12.1.1 dictate specific
scenarios when we are required to use SIPS URIs in Contact
headers. Asterisk's non-compliance with this could actually
cause calls to get dropped when communicating with clients
that are strict about checking the Contact header.

Both of the SIP stacks in Asterisk suffered from this issue.
This changeset corrects the behavior in res_pjsip/chan_pjsip.c

Review: https://reviewboard.asterisk.org/r/4345
........

Merged revisions 431426 from http://svn.asterisk.org/svn/asterisk/branches/13

Added:
    trunk/res/res_pjsip_sips_contact.c
      - copied unchanged from r431426, branches/13/res/res_pjsip_sips_contact.c
Modified:
    trunk/   (props changed)
    trunk/res/res_pjsip.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.

Modified: trunk/res/res_pjsip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_pjsip.c?view=diff&rev=431427&r1=431426&r2=431427
==============================================================================
--- trunk/res/res_pjsip.c (original)
+++ trunk/res/res_pjsip.c Thu Jan 29 15:02:23 2015
@@ -2315,6 +2315,42 @@
 	return dlg;
 }
 
+/*!
+ * \brief Determine if a SIPS Contact header is required.
+ *
+ * This uses the guideline provided in RFC 3261 Section 12.1.1 to
+ * determine if the Contact header must be a sips: URI.
+ *
+ * \param rdata The incoming dialog-starting request
+ * \retval 0 SIPS not required
+ * \retval 1 SIPS required
+ */
+static int uas_use_sips_contact(pjsip_rx_data *rdata)
+{
+	pjsip_rr_hdr *record_route;
+
+	if (PJSIP_URI_SCHEME_IS_SIPS(rdata->msg_info.msg->line.req.uri)) {
+		return 1;
+	}
+
+	record_route = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_RECORD_ROUTE, NULL);
+	if (record_route) {
+		if (PJSIP_URI_SCHEME_IS_SIPS(&record_route->name_addr)) {
+			return 1;
+		}
+	} else {
+		pjsip_contact_hdr *contact;
+
+		contact = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, NULL);
+		ast_assert(contact != NULL);
+		if (PJSIP_URI_SCHEME_IS_SIPS(contact->uri)) {
+			return 1;
+		}
+	}
+
+	return 0;
+}
+
 pjsip_dialog *ast_sip_create_dialog_uas(const struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pj_status_t *status)
 {
 	pjsip_dialog *dlg;
@@ -2337,7 +2373,8 @@
 
 	contact.ptr = pj_pool_alloc(rdata->tp_info.pool, PJSIP_MAX_URL_SIZE);
 	contact.slen = pj_ansi_snprintf(contact.ptr, PJSIP_MAX_URL_SIZE,
-			"<sip:%s%.*s%s:%d%s%s>",
+			"<%s:%s%.*s%s:%d%s%s>",
+			uas_use_sips_contact(rdata) ? "sips" : "sip",
 			(type & PJSIP_TRANSPORT_IPV6) ? "[" : "",
 			(int)transport->local_name.host.slen,
 			transport->local_name.host.ptr,




More information about the svn-commits mailing list