eXosip_automatic_actionが機能しないユースケースがいくつかあります。これは仕様によるものです。
代わりに、ヒットしたユースケースでは、負の「did」パラメーターでEXOSIP_CALL_MESSAGE_REQUESTFAILUREイベントを受け取ったときに、そのようなコードを使用する必要があります。
if (exosip_event->type == EXOSIP_CALL_MESSAGE_REQUESTFAILURE && exosip_event->did < 0) {
if (exosip_event->response != NULL && (exosip_event->response->status_code == 407 || exosip_event->response->status_code == 401))
eXosip_default_action (exosip_event);
}
上記のコードは、「exosip イベント ループ」内に追加する必要があります。
eXosip_default_actionは、欠落している自動再試行を行う必要があります!
編集: 申し訳ありませんが、これはイベントEXOSIP_MESSAGE_REQUESTFAILUREに対しても行う必要があります:
if (exosip_event->type == EXOSIP_MESSAGE_REQUESTFAILURE && exosip_event->request != NULL) {
if (exosip_event->response != NULL) {
if (MSG_IS_PUBLISH (exosip_event->request)) {
} else if (exosip_event->response->status_code == 407 || exosip_event->response->status_code == 401)
eXosip_default_action (exosip_event);
}
}
EDIT2: eXosip_automatic_actionの呼び出しが遅すぎると、実際にeXosip_automatic_actionメソッドを実行する前にトランザクションが COMPLETED になる可能性がありますか?
これは私自身のコードからの抜粋で、いつメソッドを呼び出す必要があるかを示しています。
je = eXosip_event_wait (tv_s, tv_ms);
eXosip_lock ();
eXosip_automatic_action ();
-私はosip/exosipの作者です-