rsipstack/resolver/
mod.rs1use crate::sip::{Domain, Port, Transport};
2use std::net::SocketAddr;
3#[cfg(feature = "srv_lookup")]
4pub mod sip_resolver;
5
6#[cfg(feature = "srv_lookup")]
7pub use sip_resolver::SipResolver;
8
9#[cfg(not(feature = "srv_lookup"))]
10pub type SipResolver = DummyResolver;
11
12#[derive(Debug, Clone, PartialEq, Eq, Hash)]
13pub struct Target {
14 pub addr: SocketAddr,
15 pub transport: Transport,
16}
17
18#[derive(Debug, Clone)]
19pub struct DummyResolver {}
20
21impl Default for DummyResolver {
22 fn default() -> Self {
23 Self::new()
24 }
25}
26
27impl DummyResolver {
28 pub fn new() -> Self {
29 Self {}
30 }
31 pub async fn lookup(
32 &self,
33 domain: &Domain,
34 port: Option<Port>,
35 transport: Option<Transport>,
36 secure: bool,
37 ) -> Result<Vec<Target>, String> {
38 let domain_str = domain.to_string();
40
41 let actual_port: u16 = if let Some(p) = port {
42 p.into()
43 } else {
44 let t = transport.unwrap_or(if secure {
45 Transport::Tls
46 } else {
47 Transport::Udp
48 });
49 t.default_port().into()
50 };
51
52 let addr_str = format!("{}:{}", domain_str, actual_port);
53 let lookup_result = tokio::net::lookup_host(&addr_str).await;
54
55 match lookup_result {
56 Ok(addrs) => {
57 let t = transport.unwrap_or(if secure {
58 Transport::Tls
59 } else {
60 Transport::Udp
61 });
62 let targets: Vec<Target> =
63 addrs.map(|addr| Target { addr, transport: t }).collect();
64
65 if targets.is_empty() {
66 Err(format!("No addresses found for {}", domain_str))
67 } else {
68 Ok(targets)
69 }
70 }
71 Err(e) => Err(format!("DNS resolution failed for {}: {}", domain_str, e)),
72 }
73 }
74}