use url::Url;
use crate::plain::exchange;
use crate::{Error, Response, Scheme, Status};
pub(crate) async fn fetch(url: &Url) -> Result<Response, Error> {
let host = url
.host_str()
.ok_or_else(|| Error::BadUrl("nex URL has no host".into()))?;
let port = url.port().unwrap_or_else(|| Scheme::Nex.default_port());
let path = url.path();
let path = if path.is_empty() { "/" } else { path };
let request = format!("{path}\r\n");
let body = exchange(host, port, request.as_bytes()).await?;
Ok(Response {
url: url.clone(),
status: Status::Success,
raw_status: None,
meta: String::new(),
body,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn nex_scheme_routes_to_port_1900() {
assert_eq!(Scheme::Nex.default_port(), 1900);
}
#[tokio::test]
#[ignore = "hits the live network; run with `cargo test -- --ignored`"]
async fn live_nex_smoke() {
let r = crate::fetch("nex://nightfall.city/")
.await
.expect("fetch nex root");
assert_eq!(r.status, Status::Success);
assert!(!r.body.is_empty());
}
}