Estamos tentando atualizar nossa biblioteca SIP.js de 0.7.5 para 0.9.1.
Temos um problema ao fazer Reinvite para adicionar vídeo na chamada. O problema é que nosso servidor Kamailio não envia o cabeçalho Record-Route na chamada reINVITE. De acordo com o SIP RFC, este comportamento Kamailio é normal.
https://tools.ietf.org/html/rfc3261#section -12.1.2
A rota definida DEVE ser definida para a lista de URIs no campo de cabeçalho Record-Route da resposta, tomada na ordem inversa e preservando todos os parâmetros de URI. Se nenhum campo de cabeçalho Record-Route estiver presente na resposta, o conjunto de rotas DEVE ser definido como o conjunto vazio. Este conjunto de rotas, mesmo se vazio, substitui qualquer conjunto de rotas pré-existente para solicitações futuras nesta caixa de diálogo. O destino remoto DEVE ser definido como o URI do campo de cabeçalho do contato da resposta
https://tools.ietf.org/html/rfc3261#section -12.2
As solicitações dentro de uma caixa de diálogo PODEM conter campos de cabeçalho de registro-rota e contato. No entanto, essas solicitações não fazem com que o conjunto de rotas do diálogo seja modificado, embora possam modificar o URI de destino remoto.
Como posso ver na versão 0.7.5 do sip.js, o cabeçalho da rota sempre foi obtido a partir do pedido (this.request), mas na versão 0.9.1 do sip.js é obtido da última resposta (this.response) que em nosso caso não t tem cabeçalho de rota de registro.
Aqui está a diferença entre as versões:
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
Então o que eu fiz mudou um pouco o seu código 0.9.1. Se a resposta tiver cabeçalho (s) de rota de registro, nós os adicionaremos ao ACK, mas não tentaremos retirá-los da solicitação anterior. Se não tivermos nenhuma rota, vamos deixá-la vazia.
https://www.dropbox.com/s/1rrhyfnxe9sa88a/Screenshot%202018-01-17%2013.50.11.png?dl=0
Eu só quero saber por que você mudou de comportamento. Existe um erro meu ou seu?
A seção que você está procurando é, na verdade, a seção 14:
https://tools.ietf.org/html/rfc3261#section -14
Verifique a funcionalidade do seu código em relação a essa seção, pois a seção 12 não se aplica neste caso. De um modo geral, o suporte reINVITE não era estável o suficiente no 0.7.x para ser considerado suportado, mas o suporte foi desenvolvido de acordo com as especificações no 0.8.x.
Eu verifiquei completamente a seção 14, e ela não diz nada sobre o uso / modificação do "conjunto de roteamento"
Mas voltando à seção 12 - "conjunto de rotas" - deve ser formado durante o processamento inicial de INVITE e reutilizado sem modificação durante o processamento de mensagens no diálogo.
A citação de partes apropriadas do RFC é fornecida acima.
Por enquanto, a questão é por que "conjunto de rotas" é modificado no diálogo (sip.js versão 0.9.1 leva da última resposta this.response) - já que isso não está em conformidade com RFC.
Ei, Denis, eu investiguei isso e falei com James sobre isso.
Este é um bug, mas parece que o comportamento original também não estava correto, pois permitia que o conjunto de rotas fosse atualizado em uma caixa de diálogo.
O comportamento do UAS ao responder a uma solicitação de formação de diálogo, descrito em https://tools.ietf.org/html/rfc3261#section -12.1.1, deve ser copiar os cabeçalhos de rota de registro, revertê-los e salvá-los em um diálogo variável com escopo definido como a rota definida.
Ao responder às solicitações em uma caixa de diálogo, o comportamento do UAS, conforme descrito em https://tools.ietf.org/html/rfc3261#section -12.2, deve ser reutilizar o conjunto de rotas existente com escopo na caixa de diálogo.
O comportamento atual de depender da presença de cabeçalhos de rota de registro em solicitações dentro de uma caixa de diálogo para recriar o conjunto de rotas não está correto.
Vamos corrigir isso na próxima versão, mas enquanto isso você pode contornar chamando record_route () para todas as solicitações, iniciais e sequenciais, de modo que os cabeçalhos de rota de registro estejam em solicitações sequenciais como https: //tools.ietf. org / html / rfc3261 # section -12.2 diz que é opcional.
Estou tendo o mesmo problema, por que esse problema foi fechado enquanto o problema não foi realmente corrigido?
Consegui obter os cabeçalhos encontrando a caixa de diálogo e copiando-os de lá.
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 pontos para o estilo, eu acho, mas acho que a solução será semelhante a esta.
Parece que o repórter original encerrou o problema. Eu o reabri e estamos analisando ativamente este código.
Obrigado @egreenmachine. Isso também afeta a retenção / liberação (novos convites).
O caso que tivemos foi o pacote BYE não ter as rotas corretas após um novo convite em espera.
Comentários muito úteis
Ei, Denis, eu investiguei isso e falei com James sobre isso.
Este é um bug, mas parece que o comportamento original também não estava correto, pois permitia que o conjunto de rotas fosse atualizado em uma caixa de diálogo.
O comportamento do UAS ao responder a uma solicitação de formação de diálogo, descrito em https://tools.ietf.org/html/rfc3261#section -12.1.1, deve ser copiar os cabeçalhos de rota de registro, revertê-los e salvá-los em um diálogo variável com escopo definido como a rota definida.
Ao responder às solicitações em uma caixa de diálogo, o comportamento do UAS, conforme descrito em https://tools.ietf.org/html/rfc3261#section -12.2, deve ser reutilizar o conjunto de rotas existente com escopo na caixa de diálogo.
O comportamento atual de depender da presença de cabeçalhos de rota de registro em solicitações dentro de uma caixa de diálogo para recriar o conjunto de rotas não está correto.
Vamos corrigir isso na próxima versão, mas enquanto isso você pode contornar chamando record_route () para todas as solicitações, iniciais e sequenciais, de modo que os cabeçalhos de rota de registro estejam em solicitações sequenciais como https: //tools.ietf. org / html / rfc3261 # section -12.2 diz que é opcional.