@@ -10,14 +10,15 @@ use crate::{
1010 transaction:: {
1111 endpoint:: EndpointInnerRef ,
1212 key:: { TransactionKey , TransactionRole } ,
13+ make_via_branch,
1314 transaction:: { Transaction , TransactionEventSender } ,
1415 } ,
1516 Result ,
1617} ;
1718use rsip:: {
1819 headers:: Route ,
1920 prelude:: { HeadersExt , ToTypedHeader , UntypedHeader } ,
20- typed:: { CSeq , Contact } ,
21+ typed:: { CSeq , Contact , Via } ,
2122 Header , Param , Request , Response , SipMessage , StatusCode ,
2223} ;
2324use std:: sync:: {
@@ -289,12 +290,31 @@ impl DialogInner {
289290 Ok ( ( ) )
290291 }
291292
292- pub ( super ) fn make_request (
293+ pub ( super ) fn build_vias_from_request ( & self ) -> Result < Vec < Via > > {
294+ let mut vias = vec ! [ ] ;
295+ for header in self . initial_request . headers . iter ( ) {
296+ if let Header :: Via ( via) = header {
297+ if let Ok ( mut typed_via) = via. typed ( ) {
298+ for param in typed_via. params . iter_mut ( ) {
299+ if let Param :: Branch ( _) = param {
300+ * param = make_via_branch ( ) ;
301+ }
302+ }
303+ vias. push ( typed_via) ;
304+ return Ok ( vias) ;
305+ }
306+ }
307+ }
308+ let via = self . endpoint_inner . get_via ( None , None ) ?;
309+ vias. push ( via) ;
310+ Ok ( vias)
311+ }
312+
313+ pub ( super ) fn make_request_with_vias (
293314 & self ,
294315 method : rsip:: Method ,
295316 cseq : Option < u32 > ,
296- addr : Option < crate :: transport:: SipAddr > ,
297- branch : Option < Param > ,
317+ vias : Vec < rsip:: headers:: typed:: Via > ,
298318 headers : Option < Vec < rsip:: Header > > ,
299319 body : Option < Vec < u8 > > ,
300320 ) -> Result < rsip:: Request > {
@@ -304,8 +324,9 @@ impl DialogInner {
304324 method,
305325 } ;
306326
307- let via = self . endpoint_inner . get_via ( addr, branch) ?;
308- headers. push ( via. into ( ) ) ;
327+ for via in vias {
328+ headers. push ( Header :: Via ( via. into ( ) ) ) ;
329+ }
309330 headers. push ( Header :: CallId (
310331 self . id . lock ( ) . unwrap ( ) . call_id . clone ( ) . into ( ) ,
311332 ) ) ;
@@ -339,6 +360,19 @@ impl DialogInner {
339360 Ok ( req)
340361 }
341362
363+ pub ( super ) fn make_request (
364+ & self ,
365+ method : rsip:: Method ,
366+ cseq : Option < u32 > ,
367+ addr : Option < crate :: transport:: SipAddr > ,
368+ branch : Option < Param > ,
369+ headers : Option < Vec < rsip:: Header > > ,
370+ body : Option < Vec < u8 > > ,
371+ ) -> Result < rsip:: Request > {
372+ let via = self . endpoint_inner . get_via ( addr, branch) ?;
373+ self . make_request_with_vias ( method, cseq, vec ! [ via] , headers, body)
374+ }
375+
342376 pub ( super ) fn make_response (
343377 & self ,
344378 request : & Request ,
0 commit comments