@@ -336,11 +336,17 @@ impl SipConnection {
336336 typed_via. params . retain ( |param| {
337337 if let Param :: Other ( key, _) = param {
338338 !key. value ( ) . eq_ignore_ascii_case ( "rport" )
339+ } else if let Param :: Transport ( _) = param {
340+ false
339341 } else {
340342 true
341343 }
342344 } ) ;
343345
346+ if transport != rsip:: transport:: Transport :: Udp && typed_via. transport != transport {
347+ typed_via. params . push ( Param :: Transport ( transport) ) ;
348+ }
349+
344350 * via = typed_via
345351 . with_param ( Param :: Received ( rsip:: param:: Received :: new (
346352 received. host . to_string ( ) ,
@@ -353,8 +359,11 @@ impl SipConnection {
353359 Ok ( ( ) )
354360 }
355361
356- pub fn parse_target_from_via ( via : & rsip:: headers:: untyped:: Via ) -> Result < rsip:: HostWithPort > {
362+ pub fn parse_target_from_via (
363+ via : & rsip:: headers:: untyped:: Via ,
364+ ) -> Result < ( rsip:: Transport , rsip:: HostWithPort ) > {
357365 let mut host_with_port = via. uri ( ) ?. host_with_port ;
366+ let mut transport = via. trasnport ( ) . unwrap_or ( rsip:: Transport :: Udp ) ;
358367 if let Ok ( params) = via. params ( ) . as_ref ( ) {
359368 for param in params {
360369 match param {
@@ -363,6 +372,9 @@ impl SipConnection {
363372 host_with_port. host = addr. into ( ) ;
364373 }
365374 }
375+ Param :: Transport ( t) => {
376+ transport = t. clone ( ) ;
377+ }
366378 Param :: Other ( key, Some ( value) ) if key. value ( ) . eq_ignore_ascii_case ( "rport" ) => {
367379 if let Ok ( port) = value. value ( ) . try_into ( ) {
368380 host_with_port. port = Some ( port) ;
@@ -372,13 +384,13 @@ impl SipConnection {
372384 }
373385 }
374386 }
375- Ok ( host_with_port)
387+ Ok ( ( transport , host_with_port) )
376388 }
377389
378390 pub fn get_destination ( msg : & rsip:: SipMessage ) -> Result < SocketAddr > {
379391 let host_with_port = match msg {
380392 rsip:: SipMessage :: Request ( req) => req. uri ( ) . host_with_port . clone ( ) ,
381- rsip:: SipMessage :: Response ( res) => Self :: parse_target_from_via ( res. via_header ( ) ?) ?,
393+ rsip:: SipMessage :: Response ( res) => Self :: parse_target_from_via ( res. via_header ( ) ?) ?. 1 ,
382394 } ;
383395 host_with_port. try_into ( ) . map_err ( Into :: into)
384396 }
0 commit comments