diff options
| author | mat <git@matdoes.dev> | 2025-11-21 22:53:38 +0100 |
|---|---|---|
| committer | mat <git@matdoes.dev> | 2025-11-21 22:53:38 +0100 |
| commit | 6930966aabf9b49fb6a0dc8b61076fa3f1abc298 (patch) | |
| tree | 52bd3e48c96f0898d0dce494044fbb40915da73f /azalea-protocol/src/resolver.rs | |
| parent | f464f0152a6450fafc86e1dc993b90e12e395fe7 (diff) | |
| download | azalea-drasl-6930966aabf9b49fb6a0dc8b61076fa3f1abc298.tar.xz | |
refactor resolve_address
Diffstat (limited to 'azalea-protocol/src/resolver.rs')
| -rw-r--r-- | azalea-protocol/src/resolver.rs | 74 |
1 files changed, 0 insertions, 74 deletions
diff --git a/azalea-protocol/src/resolver.rs b/azalea-protocol/src/resolver.rs deleted file mode 100644 index 4cd2faad..00000000 --- a/azalea-protocol/src/resolver.rs +++ /dev/null @@ -1,74 +0,0 @@ -//! Resolve IPs from hostnames. - -use std::net::{IpAddr, SocketAddr}; - -use async_recursion::async_recursion; -use hickory_resolver::{Name, TokioResolver, name_server::TokioConnectionProvider}; -use thiserror::Error; - -use crate::ServerAddress; - -#[derive(Error, Debug)] -pub enum ResolverError { - #[error("No SRV record found")] - NoSrvRecord, - #[error("No IP found")] - NoIp, -} - -/// Resolve a Minecraft server address into an IP address and port. -/// If it's already an IP address, it's returned as-is. -#[must_use] -#[async_recursion] -pub async fn resolve_address(address: &ServerAddress) -> Result<SocketAddr, ResolverError> { - // If the address.host is already in the format of an ip address, return it. - if let Ok(ip) = address.host.parse::<IpAddr>() { - return Ok(SocketAddr::new(ip, address.port)); - } - - // we specify Cloudflare instead of the default resolver because - // hickory_resolver has an issue on Windows where it's really slow using the - // default resolver - let resolver = TokioResolver::builder(TokioConnectionProvider::default()) - .unwrap() - .build(); - - // first, we do a srv lookup for _minecraft._tcp.<host> - let srv_redirect_result = resolver - .srv_lookup(format!("_minecraft._tcp.{}", address.host).as_str()) - .await; - - // if it resolves that means it's a redirect so we call resolve_address again - // with the new host - if let Ok(redirect_result) = srv_redirect_result { - let redirect_srv = redirect_result - .iter() - .next() - .ok_or(ResolverError::NoSrvRecord)?; - let redirect_address = ServerAddress { - host: redirect_srv.target().to_ascii(), - port: redirect_srv.port(), - }; - - if redirect_address.host == address.host { - let lookup_ip_result = resolver.lookup_ip(redirect_address.host).await; - let lookup_ip = lookup_ip_result.map_err(|_| ResolverError::NoIp)?; - return Ok(SocketAddr::new( - lookup_ip.iter().next().unwrap(), - redirect_address.port, - )); - } - - return resolve_address(&redirect_address).await; - } - - // there's no redirect, try to resolve this as an ip address - let name = Name::from_ascii(&address.host).map_err(|_| ResolverError::NoIp)?; - let lookup_ip_result = resolver.lookup_ip(name).await; - let lookup_ip = lookup_ip_result.map_err(|_| ResolverError::NoIp)?; - - Ok(SocketAddr::new( - lookup_ip.iter().next().unwrap(), - address.port, - )) -} |
