diff --git a/src/transaction/message.rs b/src/transaction/message.rs index e9379e0e..32da9da0 100644 --- a/src/transaction/message.rs +++ b/src/transaction/message.rs @@ -2,7 +2,7 @@ use super::{endpoint::EndpointInner, make_call_id}; use crate::{rsip_ext::extract_uri_from_contact, transaction::make_via_branch, Result}; use rsip::{ header, - headers::Route, + headers::{ContentLength, Route}, prelude::{HeadersExt, ToTypedHeader, UntypedHeader}, Error, Header, Request, Response, StatusCode, }; @@ -312,6 +312,7 @@ impl EndpointInner { cseq.mut_method(rsip::Method::Ack).ok(); } }); + headers.push(Header::ContentLength(ContentLength::default())); // 0 because of vec![] below headers.unique_push(Header::UserAgent(self.user_agent.clone().into())); Ok(rsip::Request { method: rsip::Method::Ack, diff --git a/src/transaction/tests/test_client.rs b/src/transaction/tests/test_client.rs index efb14e50..e64a4e48 100644 --- a/src/transaction/tests/test_client.rs +++ b/src/transaction/tests/test_client.rs @@ -133,6 +133,18 @@ Content-Length: 0\r\n\r\n"; let expected_uri = Uri::try_from("sip:uas@192.0.2.55:5080;transport=tcp")?; assert_eq!(ack.uri, expected_uri, "ACK must target the remote Contact"); + // Check Content-Length + let content_length: String = ack + .headers + .iter() + .filter_map(|header| match header { + Header::ContentLength(content_length) => Some(content_length.value().to_string()), + _ => None, + }) + .next() + .expect("ACK must include a Content-Length header"); + + assert_eq!(content_length, "0", "Content-Length of ACK must be 0"); let routes: Vec = ack .headers .iter()