mirror of
https://github.com/NLnetLabs/domain.git
synced 2026-09-28 12:44:59 +02:00
This PR renames all types and functions that refer to domain name from using the term “dname” to just “name.” For instance, Dname becomes Name, ToDname becomes ToName, and ToDname::to_dname becomes ToName::to_name. This annoyingly wide-reaching change is motivated by a clash with the DNAME record type that would always be confusing. So we rather do it now. This is a really breaking change. Apologies.
57 lines
1.4 KiB
Rust
57 lines
1.4 KiB
Rust
use std::str::FromStr;
|
|
|
|
use domain::base::name::Name;
|
|
use domain::resolv::StubResolver;
|
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
|
use tokio::net::TcpStream;
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let resolver = StubResolver::new();
|
|
let addr = match resolver
|
|
.lookup_host(&Name::<Vec<u8>>::from_str("www.rust-lang.org").unwrap())
|
|
.await
|
|
{
|
|
Ok(addr) => addr,
|
|
Err(err) => {
|
|
eprintln!("DNS query failed: {err}");
|
|
return;
|
|
}
|
|
};
|
|
let addr = match addr.port_iter(80).next() {
|
|
Some(addr) => addr,
|
|
None => {
|
|
eprintln!("Failed to resolve www.rust-lang.org");
|
|
return;
|
|
}
|
|
};
|
|
let mut socket = match TcpStream::connect(&addr).await {
|
|
Ok(socket) => socket,
|
|
Err(err) => {
|
|
eprintln!("Failed to connect to {addr}: {err}");
|
|
return;
|
|
}
|
|
};
|
|
if let Err(err) = socket
|
|
.write_all(
|
|
"\
|
|
GET / HTTP/1.0\r\n\
|
|
Host: www.rust-lang.org\r\n\
|
|
\r\n\
|
|
"
|
|
.as_bytes(),
|
|
)
|
|
.await
|
|
{
|
|
eprintln!("Failed to send request: {err}");
|
|
return;
|
|
};
|
|
let mut response = Vec::new();
|
|
if let Err(err) = socket.read_to_end(&mut response).await {
|
|
eprintln!("Failed to read response: {err}");
|
|
return;
|
|
}
|
|
|
|
println!("{}", String::from_utf8_lossy(&response));
|
|
}
|