Path: blob/main/crates/wasi/src/p3/sockets/host/ip_name_lookup.rs
1693 views
use tokio::net::lookup_host;1use wasmtime::component::Accessor;23use crate::p3::bindings::sockets::ip_name_lookup::{ErrorCode, Host, HostWithStore};4use crate::p3::bindings::sockets::types;5use crate::p3::sockets::WasiSockets;6use crate::sockets::WasiSocketsCtxView;7use crate::sockets::util::{from_ipv4_addr, from_ipv6_addr, parse_host};89impl HostWithStore for WasiSockets {10async fn resolve_addresses<U>(11store: &Accessor<U, Self>,12name: String,13) -> wasmtime::Result<Result<Vec<types::IpAddress>, ErrorCode>> {14let Ok(host) = parse_host(&name) else {15return Ok(Err(ErrorCode::InvalidArgument));16};17if !store.with(|mut view| view.get().ctx.allowed_network_uses.ip_name_lookup) {18return Ok(Err(ErrorCode::PermanentResolverFailure));19}20match host {21url::Host::Ipv4(addr) => Ok(Ok(vec![types::IpAddress::Ipv4(from_ipv4_addr(addr))])),22url::Host::Ipv6(addr) => Ok(Ok(vec![types::IpAddress::Ipv6(from_ipv6_addr(addr))])),23url::Host::Domain(domain) => {24// This is only resolving names, not ports, so force the port to be 0.25if let Ok(addrs) = lookup_host((domain.as_str(), 0)).await {26Ok(Ok(addrs27.map(|addr| addr.ip().to_canonical().into())28.collect()))29} else {30// If/when we use `getaddrinfo` directly, map the error properly.31Ok(Err(ErrorCode::NameUnresolvable))32}33}34}35}36}3738impl Host for WasiSocketsCtxView<'_> {}394041