Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/proxy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
22 changes: 15 additions & 7 deletions src/transaction/endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -521,13 +521,21 @@ impl EndpointInner {
self.transport_layer.get_addrs()
}

pub fn get_record_route(&self) -> Result<crate::sip::typed::RecordRoute> {
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<SipAddr>,
) -> Result<crate::sip::typed::RecordRoute> {
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 {
Expand Down
28 changes: 28 additions & 0 deletions src/transaction/tests/test_endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}