exosip_automatic_action не может повторно инициировать вызов при приеме 4xx через TCP - PullRequest
0 голосов
/ 30 марта 2020

Для запроса INVITE вызова SIP через TCP, если мы получим 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

Тем не менее, я вижу, что состояние вызова, приходящее мне на пути, либо ОБРАБАТЫВАЕТСЯ, либо ВЫЗОВА, и out_tr->last_response равно NULL.

Если я использую UDP, этого никогда не произойдет. Это происходит только для TCP или TLS.

1 Ответ

0 голосов
/ 30 марта 2020

В некоторых случаях eXosip_automatic_action не может работать. Это специально.

Вместо этого, для выбранного вами варианта использования вам нужно использовать такой код, когда вы получаете событие EXOSIP_CALL_MESSAGE_REQUESTFAILURE с отрицательным параметром "did":

  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 l oop" .

eXosip_default_action должно выполнять автомат c отсутствует повторная попытка!

РЕДАКТИРОВАТЬ: извините, это также необходимо сделать для события 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);
  }
}

РЕДАКТИРОВАТЬ2: Возможно, что если вы позвоните eXosip_automatic_action слишком поздно, затем транзакция преобразуется в ЗАВЕРШЕНО, прежде чем вы фактически задействуете метод eXosip_automatic_action ?

Это выдержка из моего собственного кода, показывающая WHEN метод должен быть вызван.

je = eXosip_event_wait (tv_s, tv_ms);
eXosip_lock ();
eXosip_automatic_action ();

-Я автор osip / exosip-

...