Sip.js: Отсутствует заголовок маршрута в ACK после повторного приглашения.

Созданный на 17 янв. 2018  ·  7Комментарии  ·  Источник: onsip/SIP.js

Мы пытаемся обновить нашу библиотеку SIP.js с 0.7.5 до 0.9.1.

У нас есть проблема, когда мы делаем Reinvite для добавления видео в вызов. Проблема в том, что наш сервер Kamailio не отправляет заголовок Record-Route при вызове reINVITE. Согласно SIP RFC такое поведение Kamailio является нормальным.

https://tools.ietf.org/html/rfc3261#section -12.1.2

Набор маршрутов ДОЛЖЕН быть установлен на список URI в поле заголовка Record-Route из ответа, взятого в обратном порядке и с сохранением всех параметров URI. Если в ответе нет поля заголовка Record-Route, набор маршрутов ДОЛЖЕН быть установлен в пустой набор. Этот набор маршрутов, даже если он пуст, переопределяет любой ранее существовавший маршрут, установленный для будущих запросов в этом диалоговом окне. Удаленная цель ДОЛЖНА быть установлена ​​на URI из поля заголовка Contact ответа.

https://tools.ietf.org/html/rfc3261#section -12.2

Запросы в диалоговом окне МОГУТ содержать поля заголовка Record-Route и Contact. Однако эти запросы не приводят к изменению набора маршрута диалогового окна, хотя они могут изменять удаленный целевой URI.

Как я вижу, в sip.js версии 0.7.5 заголовок Route всегда берется из запроса (this.request), но в sip.js версии 0.9.1 он берет из последнего ответа (this.response), который в нашем случае не t иметь заголовок Record-route.

Вот разница между версиями:
0.7.5) https://www.dropbox.com/s/jo055zsn9286q17/Screenshot%202018-01-17%2013.40.41.png?dl=0
0.9.1) https://www.dropbox.com/s/u41kh91h3kzvt27/Screenshot%202018-01-17%2013.42.13.png?dl=0

Я немного изменил код 0.9.1. Если в ответе есть заголовок (-ы) Record-Route, мы добавим их в ACK, мы не будем пытаться взять его из предыдущего запроса. Если у нас не будет маршрута, мы просто оставим его пустым.

https://www.dropbox.com/s/1rrhyfnxe9sa88a/Screenshot%202018-01-17%2013.50.11.png?dl=0

Я просто хочу знать, почему ты изменил поведение. Это моя или твоя ошибка?

Самый полезный комментарий

Привет, Денис, я изучил это и поговорил с Джеймсом об этом.

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

Поведение UAS при ответе на запрос формирования диалогового окна, описанное в https://tools.ietf.org/html/rfc3261#section -12.1.1, должно заключаться в копировании заголовков маршрута записи, обратном их изменении и сохранении в диалоговом окне. переменная scoped в качестве набора маршрута.

При ответе на запросы в диалоговом окне поведение UAS, как описано в https://tools.ietf.org/html/rfc3261#section -12.2, должно заключаться в повторном использовании существующего набора маршрутов в пределах диалогового окна.

Текущее поведение в зависимости от наличия заголовков маршрута записи в запросах в диалоговом окне для повторного создания набора маршрутов является неправильным.

Мы исправим это в следующем выпуске, но пока вы можете обойти эту проблему, вызвав record_route () для всех запросов, начальных и последовательных, чтобы заголовки маршрута записи находились в последовательных запросах как https: //tools.ietf. org / html / rfc3261 # раздел -12.2 говорит, что это необязательно.

Все 7 Комментарий

Раздел, который вы ищете, на самом деле раздел 14:

https://tools.ietf.org/html/rfc3261#section -14

Пожалуйста, сравните функциональность вашего кода с этим разделом, так как раздел 12 в этом случае не применяется. Вообще говоря, поддержка reINVITE была недостаточно стабильной в 0.7.x, чтобы даже считаться поддерживаемой, но поддержка была конкретизирована в соответствии со спецификацией в 0.8.x.

Я тщательно проверил раздел 14, и в нем ничего не говорится об использовании / изменении «набора маршрутизации».

Но возвращаясь к разделу 12 - «набор маршрутов» - необходимо сформировать при начальной обработке INVITE и повторно использовать без изменений при обработке диалоговых сообщений.
Цитирование соответствующих частей RFC приведено выше.

На данный момент вопрос в том, почему «набор маршрутов» изменен в диалоговом окне (sip.js версии 0.9.1 берет из последнего ответа this.response) - поскольку это не соответствует RFC.

Привет, Денис, я изучил это и поговорил с Джеймсом об этом.

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

Поведение UAS при ответе на запрос формирования диалогового окна, описанное в https://tools.ietf.org/html/rfc3261#section -12.1.1, должно заключаться в копировании заголовков маршрута записи, обратном их изменении и сохранении в диалоговом окне. переменная scoped в качестве набора маршрута.

При ответе на запросы в диалоговом окне поведение UAS, как описано в https://tools.ietf.org/html/rfc3261#section -12.2, должно заключаться в повторном использовании существующего набора маршрутов в пределах диалогового окна.

Текущее поведение в зависимости от наличия заголовков маршрута записи в запросах в диалоговом окне для повторного создания набора маршрутов является неправильным.

Мы исправим это в следующем выпуске, но пока вы можете обойти эту проблему, вызвав record_route () для всех запросов, начальных и последовательных, чтобы заголовки маршрута записи находились в последовательных запросах как https: //tools.ietf. org / html / rfc3261 # раздел -12.2 говорит, что это необязательно.

У меня такая же проблема, почему эта проблема закрыта, а проблема на самом деле не устранена?
Мне удалось получить заголовки, найдя диалог и скопировав их оттуда.

diff --git a/src/SIPMessage.ts b/src/SIPMessage.ts
index a95e8ee..3226160 100644
--- a/src/SIPMessage.ts
+++ b/src/SIPMessage.ts
@@ -755,6 +755,9 @@ export class IncomingResponse extends IncomingMessage implements IncomingRespons
     if (!contact || !contact.uri) {
       throw new Error("Failed to parse contact header.");
     }
+
+    const dialog = this.ua.dialogs[this.callId + this.fromTag + this.toTag];
+
     const ruri = contact.uri;
     const request = new OutgoingRequest(
       C.ACK,
@@ -767,7 +770,7 @@ export class IncomingResponse extends IncomingMessage implements IncomingRespons
         fromTag: this.fromTag,
         toUri: this.to.uri,
         toTag: this.toTag,
-        routeSet: this.getHeaders("record-route").reverse()
+        routeSet: (dialog ? dialog.routeSet : this.getHeaders("record-route").reverse())
       },
       options ? options.extraHeaders : undefined,
       options ? options.body : undefined

Думаю, 0 баллов за стиль, но думаю, что решение будет похоже на это.

Похоже, первоначальный репортер закрыл проблему. Я снова открыл его, и мы активно изучаем этот код.

Спасибо @egreenmachine. Это также влияет на удержание / удержание (повторное приглашение).

У нас был случай, когда у пакета BYE не было правильных маршрутов после повторного приглашения удержания.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги