SIP.jsライブラリを0.7.5から0.9.1に更新しようとしています。
通話中にビデオを追加するためにReinviteを作成するときに問題が発生します。 問題は、KamailioサーバーがreINVITE呼び出しでRecord-Routeヘッダーを送信しないことです。 SIP RFCによると、このKamailioの動作は正常です。
https://tools.ietf.org/html/rfc3261#section -12.1.2
ルートセットは、応答からのRecord-RouteヘッダーフィールドのURIのリストに設定する必要があり、逆の順序で取得され、すべてのURIパラメーターが保持されます。 Record-Routeヘッダーフィールドが応答に存在しない場合、ルートセットは空のセットに設定する必要があります。 このルートセットは、空の場合でも、このダイアログでの今後のリクエストのために既存のルートセットを上書きします。 リモートターゲットは、応答のContactヘッダーフィールドからURIに設定する必要があります
https://tools.ietf.org/html/rfc3261#section -12.2
ダイアログ内のリクエストには、Record-RouteヘッダーフィールドとContactヘッダーフィールドが含まれる場合があります。 ただし、これらの要求によってダイアログのルートセットが変更されることはありませんが、リモートターゲットURIが変更される可能性があります。
sip.jsバージョン0.7.5でわかるように、ルートヘッダーは常にrequest(this.request)から取得されましたが、sip.jsバージョン0.9.1では、最後の応答(this.response)から取得されます。 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
なぜあなたが行動を変えたのか知りたいだけです。 私またはあなたの間違いはありますか?
あなたが探しているセクションは実際にはセクション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に準拠していないためです。
ねえデニス、私はこれを調べて、ジェームズと話しました。
これはバグですが、ダイアログ内でルートセットを更新できるという点で、元の動作も正しくなかったようです。
https://tools.ietf.org/html/rfc3261#section -12.1.1で説明されているダイアログ形成要求に応答するときのUASの動作は、レコードルートヘッダーをコピーし、それらを逆にして、ダイアログに保存することです。ルートセットとしてのスコープ変数。
ダイアログ内の要求に応答する場合、 https: //tools.ietf.org/html/rfc3261#section -12.2で説明されているように、UASの動作は、ダイアログ内でスコープされた既存のルートセットを再利用する必要があります。
ルートセットを再作成するためのダイアログ内のリクエストのレコードルートヘッダーの存在に依存する現在の動作は正しくありません。
これは次のリリースで修正される予定ですが、それまでの間、初期および順次のすべてのリクエストに対してrecord_route()を呼び出すことで回避できるため、record-routeヘッダーはhttps://tools.ietfのように順次リクエストに含まれ
同じ問題が発生していますが、実際には修正されていないのに、なぜこの問題が解決されるのですか?
ダイアログを見つけてそこからコピーすることで、なんとかヘッダーを取得できました。
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パケットに正しいルートがない場合がありました。
最も参考になるコメント
ねえデニス、私はこれを調べて、ジェームズと話しました。
これはバグですが、ダイアログ内でルートセットを更新できるという点で、元の動作も正しくなかったようです。
https://tools.ietf.org/html/rfc3261#section -12.1.1で説明されているダイアログ形成要求に応答するときのUASの動作は、レコードルートヘッダーをコピーし、それらを逆にして、ダイアログに保存することです。ルートセットとしてのスコープ変数。
ダイアログ内の要求に応答する場合、 https: //tools.ietf.org/html/rfc3261#section -12.2で説明されているように、UASの動作は、ダイアログ内でスコープされた既存のルートセットを再利用する必要があります。
ルートセットを再作成するためのダイアログ内のリクエストのレコードルートヘッダーの存在に依存する現在の動作は正しくありません。
これは次のリリースで修正される予定ですが、それまでの間、初期および順次のすべてのリクエストに対してrecord_route()を呼び出すことで回避できるため、record-routeヘッダーはhttps://tools.ietfのように順次リクエストに含まれ