This commit is contained in:
2025-11-14 13:49:16 -05:00
parent d72a070a73
commit d384154310
7 changed files with 925 additions and 121 deletions

51
src/net/client.rs Normal file
View File

@@ -0,0 +1,51 @@
use quinn::{crypto::rustls::QuicClientConfig, rustls::pki_types::CertificateDer};
use std::{
fs,
io::ErrorKind,
net::{IpAddr, Ipv6Addr, SocketAddr},
str::FromStr,
sync::Arc,
};
#[tokio::main]
pub async fn connect() -> anyhow::Result<()> {
let dirs = directories_next::ProjectDirs::from("", "", "openworm").unwrap();
let mut roots = quinn::rustls::RootCertStore::empty();
match fs::read(dirs.data_local_dir().join("cert.der")) {
Ok(cert) => {
roots.add(CertificateDer::from(cert))?;
}
Err(ref e) if e.kind() == ErrorKind::NotFound => {
eprintln!("local server certificate not found");
}
Err(e) => {
eprintln!("failed to open local server certificate: {}", e);
}
}
let client_crypto = quinn::rustls::ClientConfig::builder()
.with_root_certificates(roots)
.with_no_client_auth();
let client_config =
quinn::ClientConfig::new(Arc::new(QuicClientConfig::try_from(client_crypto)?));
let mut endpoint = quinn::Endpoint::client(SocketAddr::from_str("[::]:0").unwrap())?;
endpoint.set_default_client_config(client_config);
let remote = SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 4433);
let host = "localhost";
let conn = endpoint
.connect(remote, host)?
.await
.map_err(|e| anyhow::anyhow!("failed to connect: {}", e))?;
let (mut send, mut recv) = conn
.open_bi()
.await
.map_err(|e| anyhow::anyhow!("failed to open stream: {}", e))?;
drop(recv);
send.write_all(&[39]).await.expect("failed to send");
send.finish().unwrap();
send.stopped().await.unwrap();
Ok(())
}