[svn-commits] file: branch file/pjsip-outbound-publish r419850 - /team/file/pjsip-outbound-...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jul 31 10:16:18 CDT 2014


Author: file
Date: Thu Jul 31 10:16:12 2014
New Revision: 419850

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=419850
Log:
Handle 412 and 423 response codes.

Modified:
    team/file/pjsip-outbound-publish/res/res_pjsip_outbound_publish.c

Modified: team/file/pjsip-outbound-publish/res/res_pjsip_outbound_publish.c
URL: http://svnview.digium.com/svn/asterisk/team/file/pjsip-outbound-publish/res/res_pjsip_outbound_publish.c?view=diff&rev=419850&r1=419849&r2=419850
==============================================================================
--- team/file/pjsip-outbound-publish/res/res_pjsip_outbound_publish.c (original)
+++ team/file/pjsip-outbound-publish/res/res_pjsip_outbound_publish.c Thu Jul 31 10:16:12 2014
@@ -568,7 +568,49 @@
 
 	ao2_lock(publish->state);
 
-	if (publish->state->sending) {
+	if (param->code == 412) {
+		pjsip_publishc_opt opt = {
+			.queue_request = PJ_FALSE,
+		};
+		pj_str_t event, server_uri, to_uri, from_uri;
+
+		pjsip_publishc_destroy(publish->state->client);
+		if (pjsip_publishc_create(ast_sip_get_pjsip_endpoint(), &opt, publish, sip_outbound_publish_callback,
+			&publish->state->client) != PJ_SUCCESS) {
+			ast_log(LOG_ERROR, "Failed to create a new outbound publish client for '%s' on 412 response\n",
+				ast_sorcery_object_get_id(publish));
+			return;
+		}
+
+		pj_cstr(&event, publish->event);
+		pj_cstr(&server_uri, publish->server_uri);
+		pj_cstr(&to_uri, S_OR(publish->to_uri, publish->server_uri));
+		pj_cstr(&from_uri, S_OR(publish->from_uri, publish->server_uri));
+
+		/* Re-initialize the publish client so it starts with fresh state */
+		if (pjsip_publishc_init(publish->state->client, &event, &server_uri, &from_uri, &to_uri,
+			publish->expiration) != PJ_SUCCESS) {
+			ast_log(LOG_ERROR, "Failed to initialize outbound publish '%s' to send an initial PUBLISH on 412 response\n",
+				ast_sorcery_object_get_id(publish));
+			return;
+		}
+
+		/* Setting this to NULL will cause a new PUBLISH to get created and sent for the same underlying body */
+		publish->state->sending = NULL;
+	} else if (param->code == 423) {
+		/* Update the expiration with the new expiration time if available */
+		pjsip_expires_hdr *expires;
+
+		expires = pjsip_msg_find_hdr(param->rdata->msg_info.msg, PJSIP_H_MIN_EXPIRES, NULL);
+		if (!expires || !expires->ivalue) {
+			ast_log(LOG_ERROR, "Received 402 response on outbound publish '%s' without a Min-Expires header\n",
+				ast_sorcery_object_get_id(publish));
+			return;
+		}
+
+		pjsip_publishc_update_expires(publish->state->client, expires->ivalue);
+		publish->state->sending = NULL;
+	} else if (publish->state->sending) {
 		/* Remove the message currently being sent so that when the queue is serviced another will get sent */
 		AST_LIST_REMOVE_HEAD(&publish->state->queue, entry);
 		ast_free(publish->state->sending);




More information about the svn-commits mailing list