Thanks to visit codestin.com
Credit goes to docs.rs

Skip to main content

rsipstack/resolver/
mod.rs

1use 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        // Dummy implementation: A/AAAA only using system resolver (tokio::net::lookup_host)
39        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}