From 137c3c083404a4128904f715e96cf4720823e345 Mon Sep 17 00:00:00 2001 From: slyoldfox Date: Sat, 4 Oct 2025 16:39:20 +0200 Subject: [PATCH 1/3] Always send Content-Length, even if body is None This could be the case if you're sending dialog.ringing(Some(headers, None)) --- src/dialog/dialog.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/dialog/dialog.rs b/src/dialog/dialog.rs index 0a17f215..ef0b5514 100644 --- a/src/dialog/dialog.rs +++ b/src/dialog/dialog.rs @@ -454,9 +454,11 @@ impl DialogInner { .as_ref() .map(|c| resp_headers.push(Contact::from(c.clone()).into())); - body.as_ref().map(|b| { - resp_headers.push(Header::ContentLength((b.len() as u32).into())); - }); + resp_headers.push(Header::ContentLength( + body.as_ref() + .map_or(0u32, |b| b.len() as u32) + .into(), + )); resp_headers.push(Header::UserAgent( self.endpoint_inner.user_agent.clone().into(), From e23e6edadda78c997460211aa1a0cf94ce2c6d82 Mon Sep 17 00:00:00 2001 From: slyoldfox Date: Sat, 4 Oct 2025 22:54:29 +0200 Subject: [PATCH 2/3] https://www.rfc-editor.org/rfc/rfc3261.html#section-18.3 In stream oriented transports (TCP), Content-Length MUST be specified. Removed Header::MaxForwards from response because this is a request only header. --- src/dialog/dialog.rs | 8 +++++--- src/transaction/message.rs | 6 +++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/dialog/dialog.rs b/src/dialog/dialog.rs index ef0b5514..513c7d5f 100644 --- a/src/dialog/dialog.rs +++ b/src/dialog/dialog.rs @@ -361,9 +361,11 @@ impl DialogInner { } headers.push(Header::MaxForwards(70.into())); - body.as_ref().map(|b| { - headers.push(Header::ContentLength((b.len() as u32).into())); - }); + headers.push(Header::ContentLength( + body.as_ref() + .map_or(0u32, |b| b.len() as u32) + .into(), + )); let req = rsip::Request { method, diff --git a/src/transaction/message.rs b/src/transaction/message.rs index c5289134..26444ec8 100644 --- a/src/transaction/message.rs +++ b/src/transaction/message.rs @@ -226,10 +226,14 @@ impl EndpointInner { | Header::CallId(_) | Header::From(_) | Header::To(_) - | Header::MaxForwards(_) | Header::CSeq(_) ) }); + headers.push(Header::ContentLength( + body.as_ref() + .map_or(0u32, |b| b.len() as u32) + .into(), + )); headers.unique_push(Header::UserAgent(self.user_agent.clone().into())); Response { status_code, From ab4a83a506cf582fe98676e9fe00eb20b092011a Mon Sep 17 00:00:00 2001 From: slyoldfox Date: Sat, 4 Oct 2025 22:54:29 +0200 Subject: [PATCH 3/3] Format fix --- src/dialog/dialog.rs | 8 ++------ src/transaction/message.rs | 6 ++---- src/transport/tests/test_stream_encoding.rs | 4 ++-- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/dialog/dialog.rs b/src/dialog/dialog.rs index 513c7d5f..b1567064 100644 --- a/src/dialog/dialog.rs +++ b/src/dialog/dialog.rs @@ -362,9 +362,7 @@ impl DialogInner { headers.push(Header::MaxForwards(70.into())); headers.push(Header::ContentLength( - body.as_ref() - .map_or(0u32, |b| b.len() as u32) - .into(), + body.as_ref().map_or(0u32, |b| b.len() as u32).into(), )); let req = rsip::Request { @@ -457,9 +455,7 @@ impl DialogInner { .map(|c| resp_headers.push(Contact::from(c.clone()).into())); resp_headers.push(Header::ContentLength( - body.as_ref() - .map_or(0u32, |b| b.len() as u32) - .into(), + body.as_ref().map_or(0u32, |b| b.len() as u32).into(), )); resp_headers.push(Header::UserAgent( diff --git a/src/transaction/message.rs b/src/transaction/message.rs index 26444ec8..0d9ef214 100644 --- a/src/transaction/message.rs +++ b/src/transaction/message.rs @@ -230,10 +230,8 @@ impl EndpointInner { ) }); headers.push(Header::ContentLength( - body.as_ref() - .map_or(0u32, |b| b.len() as u32) - .into(), - )); + body.as_ref().map_or(0u32, |b| b.len() as u32).into(), + )); headers.unique_push(Header::UserAgent(self.user_agent.clone().into())); Response { status_code, diff --git a/src/transport/tests/test_stream_encoding.rs b/src/transport/tests/test_stream_encoding.rs index 9b7dedc1..a247f6c3 100644 --- a/src/transport/tests/test_stream_encoding.rs +++ b/src/transport/tests/test_stream_encoding.rs @@ -319,7 +319,7 @@ fn test_sip_codec_multiple_messages_with_bodies() { assert_eq!(req.call_id_header().unwrap().value(), "test-call-id-2"); } _ => panic!("Expected request message"), - } + } // Buffer should be empty after consuming both messages assert_eq!( @@ -327,4 +327,4 @@ fn test_sip_codec_multiple_messages_with_bodies() { 0, "Buffer should be empty after consuming all messages" ); -} \ No newline at end of file +}