< Previous by Date | Date Index | Next by Date > |
< Previous in Thread | Thread Index | Next in Thread > |
That is pretty odd behaviour by the far end. Mid-dialog forking is not allowed (3261 sec 14.1). If we detect a 200 with a different to tag and the dialogset is a UAS dialogset (ie. no base creator) - then we should either:
1. Ack the 200 and then send a bye. or
2. Just ignore the 200 - don't proceed to create a dialog for it - but log an error.
I'm leaning towards 2.
Scott From: resiprocate-devel-bounces@xxxxxxxxxxxxxxxxxxxx on behalf of Justin Matthews Sent: Sat 12/9/2006 5:26 PM To: resiprocate-devel@xxxxxxxxxxxxxxxxxxx Subject: [reSIProcate] exception when receiving 200 from re-invite requestwith modified to: tag Exception occurs during following scenario:
DUM receives a call and establishes a session as the UAS.
DUM sends re-INVITE request
DUM receives 200 ok response with a different to: tag then the established session.
The dialogset is found, but dialogset.cxx tries to create a new dialog from this 200 and calls the following code:
Dialog.cxx, in Dialog constructor:
mLocalContact = creator->getLastRequest()->header(h_Contacts).front();
I believe that getLastRequest does not contain a contact because this call was established from an inbound session.
For now I just patched it this way, is there a better way? If not I will commit this. ------------------- BaseCreator* creator = mDialogSet.getCreator(); //assert(creator);// !jf! throw or something here //assert(creator->getLastRequest()->exists(h_Contacts)); //assert(!creator->getLastRequest()->header(h_Contacts).empty()); if( NULL == creator ) { ErrLog(<< "BaseCreator is null for DialogSet"); ErrLog(<< response); throw Exception("BaseCreator is null for DialogSet", __FILE__, __LINE__); }
SharedPtr<SipMessage> lastRequest(creator->getLastRequest());
if( NULL == lastRequest || !lastRequest->exists(h_Contacts) || lastRequest->header(h_Contacts).empty()) { ErrLog(<< "No contact available for dialogset's last request"); ErrLog(<< response); throw Exception("No contact available for dialogset's last request", __FILE__, __LINE__); } mLocalContact = creator->getLastRequest()->header(h_Contacts).front(); mRemoteTarget = contact; ----------------------
Thanks, -justin
|