0

TCP 経由の SIP コール INVITE リクエストの場合、レジストラから 401 を取得すると、exosip で認証を伴うコールの再招待が失敗します。

理想的には、exosip_automatic_action がこれを処理する必要があります (そして呼び出されます) が、次の問題によりそれ以上の処理が停止します。

  /* an EARLY dialog may have failed with 401,407 or 3Xx */
  osip_transaction_t *out_tr = NULL;

  out_tr = jc->c_out_tr; // where eXosip_call_t *jc;

この場合、コール状態がCOMPLETEDで、out_tr->last_responseが 401 または 407の場合、再招待が送信されます。

ただし、着信状態が PROCEEDING または CALLING であり、out_tr->last_responseisであることがわかりNULLます。

UDP を使用すると、このようなことはありません。これは、TCP または TLS でのみ発生します。

4

1 に答える 1

0

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の作者です-

于 2020-03-30T11:42:30.727 に答える