[asterisk-commits] murf: branch 1.2 r58115 - /branches/1.2/channels/chan_sip.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Tue Mar 6 15:52:53 MST 2007


Author: murf
Date: Tue Mar  6 16:52:52 2007
New Revision: 58115

URL: http://svn.digium.com/view/asterisk?view=rev&rev=58115
Log:
Fix for 9220: Eyebeam cannot renew subscriptions for presence info. Reason: re-SUBSCRIBE requests don't include Accept headers, which the rfc says are optional (to put it tersely), (it uses MAY), and luckily, the sip_pvt struct has the format info stored, so we simply leave it if the format is set, and the accept header null.

Modified:
    branches/1.2/channels/chan_sip.c

Modified: branches/1.2/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/channels/chan_sip.c?view=diff&rev=58115&r1=58114&r2=58115
==============================================================================
--- branches/1.2/channels/chan_sip.c (original)
+++ branches/1.2/channels/chan_sip.c Tue Mar  6 16:52:52 2007
@@ -11082,10 +11082,23 @@
  					p->subscribed = CPIM_PIDF_XML;    /* RFC 3863 format */
  				} else if (strstr(accept, "application/xpidf+xml")) {
  					p->subscribed = XPIDF_XML;        /* Early pre-RFC 3863 format with MSN additions (Microsoft Messenger) */
+				} else if (ast_strlen_zero(accept)) {
+					if (p->subscribed == NONE) { /* if the subscribed field is not already set, and there is no accept header... */
+						transmit_response(p, "489 Bad Event", req);
+
+						ast_log(LOG_WARNING,"SUBSCRIBE failure: no Accept header: pvt: stateid: %d, laststate: %d, dialogver: %d, subscribecont: '%s'\n",
+							p->stateid, p->laststate, p->dialogver, p->subscribecontext);
+						ast_set_flag(p, SIP_NEEDDESTROY);
+						return 0;
+					}
+					/* if p->subscribed is non-zero, then accept is not obligatory; according to rfc 3265 section 3.1.3, at least.
+					   so, we'll just let it ride, keeping the value from a previous subscription, and not abort the subscription */
 				} else {
  					/* Can't find a format for events that we know about */
- 					transmit_response(p, "489 Bad Event", req);
- 					ast_set_flag(p, SIP_NEEDDESTROY);	
+					char mybuf[200];
+					snprintf(mybuf,sizeof(mybuf),"489 Bad Event (format %s)", accept);
+ 					transmit_response(p, mybuf, req);
+ 					ast_set_flag(p, SIP_NEEDDESTROY);
  					return 0;
  				}
 				if (option_debug > 2)



More information about the asterisk-commits mailing list