@@ -453,6 +453,23 @@ impl ClientInviteDialog {
453453 match msg {
454454 SipMessage :: Request ( _) => { }
455455 SipMessage :: Response ( resp) => {
456+ let branch = match tx
457+ . original
458+ . via_header ( ) ?
459+ . params ( ) ?
460+ . iter ( )
461+ . find ( |p| matches ! ( p, rsip:: Param :: Branch ( _) ) )
462+ {
463+ Some ( p) => p. clone ( ) ,
464+ None => {
465+ info ! ( id=%self . id( ) , "no branch found in via header" ) ;
466+ return Err ( crate :: Error :: DialogError (
467+ "no branch found in via header" . to_string ( ) ,
468+ self . id ( ) ,
469+ ) ) ;
470+ }
471+ } ;
472+
456473 match resp. status_code {
457474 StatusCode :: Trying => {
458475 self . inner . transition ( DialogState :: Trying ( self . id ( ) ) ) ?;
@@ -463,6 +480,21 @@ impl ClientInviteDialog {
463480 continue ;
464481 }
465482 StatusCode :: ProxyAuthenticationRequired | StatusCode :: Unauthorized => {
483+ let ack = self . inner . make_request (
484+ rsip:: Method :: Ack ,
485+ resp. cseq_header ( ) ?. seq ( ) . ok ( ) ,
486+ None ,
487+ Some ( branch) ,
488+ None ,
489+ None ,
490+ ) ?;
491+ match tx. send_ack ( ack) . await {
492+ Ok ( _) => { }
493+ Err ( e) => {
494+ warn ! ( "send ack error: {}" , e) ;
495+ }
496+ }
497+
466498 if auth_sent {
467499 final_response = Some ( resp. clone ( ) ) ;
468500 info ! ( id=%self . id( ) , "received {} response after auth sent" , resp. status_code) ;
@@ -500,42 +532,22 @@ impl ClientInviteDialog {
500532 None => { }
501533 }
502534
503- // only send ACK if response is final (2xx)
504- if matches ! ( resp. status_code, StatusCode :: OK | StatusCode :: Accepted ) {
505- let branch = match tx
506- . original
507- . via_header ( ) ?
508- . params ( ) ?
509- . iter ( )
510- . find ( |p| matches ! ( p, rsip:: Param :: Branch ( _) ) )
511- {
512- Some ( p) => p. clone ( ) ,
513- None => {
514- info ! ( id=%self . id( ) , "no branch found in via header" ) ;
515- return Err ( crate :: Error :: DialogError (
516- "no branch found in via header" . to_string ( ) ,
517- self . id ( ) ,
518- ) ) ;
519- }
520- } ;
521-
522- let ack = self . inner . make_request (
523- rsip:: Method :: Ack ,
524- resp. cseq_header ( ) ?. seq ( ) . ok ( ) ,
525- None ,
526- Some ( branch) ,
527- None ,
528- None ,
529- ) ?;
535+ let ack = self . inner . make_request (
536+ rsip:: Method :: Ack ,
537+ resp. cseq_header ( ) ?. seq ( ) . ok ( ) ,
538+ None ,
539+ Some ( branch) ,
540+ None ,
541+ None ,
542+ ) ?;
530543
531- if let Ok ( id) = DialogId :: try_from ( & ack) {
532- dialog_id = id;
533- }
534- match tx. send_ack ( ack) . await {
535- Ok ( _) => { }
536- Err ( e) => {
537- warn ! ( "send ack error: {}" , e) ;
538- }
544+ if let Ok ( id) = DialogId :: try_from ( & ack) {
545+ dialog_id = id;
546+ }
547+ match tx. send_ack ( ack) . await {
548+ Ok ( _) => { }
549+ Err ( e) => {
550+ warn ! ( "send ack error: {}" , e) ;
539551 }
540552 }
541553
0 commit comments