From 0bbde5a15d1f04015f9ba17c8ebda5a605ed0cf5 Mon Sep 17 00:00:00 2001 From: Kamila Neliba Date: Wed, 12 Aug 2026 10:38:03 -0700 Subject: [PATCH] allow overriding the address advertised in Record-Route --- examples/proxy.rs | 2 +- src/transaction/endpoint.rs | 22 +++++++++++++------- src/transaction/tests/test_endpoint.rs | 28 ++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/examples/proxy.rs b/examples/proxy.rs index b6d2dab4..fe8f443c 100644 --- a/examples/proxy.rs +++ b/examples/proxy.rs @@ -394,7 +394,7 @@ async fn handle_invite(state: AppState, mut tx: Transaction) -> Result<()> { .unwrap_or_default(); let target = state.inner.users.lock().await.get(&callee).cloned(); - let record_route = tx.endpoint_inner.get_record_route()?; + let record_route = tx.endpoint_inner.get_record_route(None)?; let target = match target { Some(u) => u, diff --git a/src/transaction/endpoint.rs b/src/transaction/endpoint.rs index 973c620a..e3b7a682 100644 --- a/src/transaction/endpoint.rs +++ b/src/transaction/endpoint.rs @@ -521,13 +521,21 @@ impl EndpointInner { self.transport_layer.get_addrs() } - pub fn get_record_route(&self) -> Result { - let first_addr = self - .transport_layer - .get_addrs() - .first() - .ok_or(Error::EndpointError("not sipaddrs".to_string())) - .cloned()?; + /// `addr` overrides which local address is advertised, without it the endpoint's + /// first listener is used. + pub fn get_record_route( + &self, + addr: Option, + ) -> Result { + let first_addr = match addr { + Some(addr) => addr, + None => self + .transport_layer + .get_addrs() + .first() + .ok_or(Error::EndpointError("not sipaddrs".to_string())) + .cloned()?, + }; let mut uri: crate::sip::Uri = first_addr.into(); uri.params.push(crate::sip::Param::Lr); Ok(crate::sip::typed::RecordRoute { diff --git a/src/transaction/tests/test_endpoint.rs b/src/transaction/tests/test_endpoint.rs index 8613e3b8..f17139c8 100644 --- a/src/transaction/tests/test_endpoint.rs +++ b/src/transaction/tests/test_endpoint.rs @@ -112,3 +112,31 @@ async fn test_endpoint_recvrequests() { } } } + +#[tokio::test] +async fn test_get_record_route_addr_override() { + let endpoint = super::create_test_endpoint(Some("127.0.0.1:15060")) + .await + .expect("create_test_endpoint"); + + let default_rr = endpoint + .inner + .get_record_route(None) + .expect("get_record_route(None)"); + assert_eq!(default_rr.uri.to_string(), "sip:127.0.0.1:15060;lr"); + + let override_addr = crate::transport::SipAddr { + r#type: Some(crate::sip::Transport::Udp), + addr: crate::sip::HostWithPort { + host: crate::sip::Host::IpAddr(std::net::IpAddr::V4(std::net::Ipv4Addr::new( + 127, 0, 0, 1, + ))), + port: Some(15061.into()), + }, + }; + let override_rr = endpoint + .inner + .get_record_route(Some(override_addr)) + .expect("get_record_route(Some)"); + assert_eq!(override_rr.uri.to_string(), "sip:127.0.0.1:15061;lr"); +}