From 5964994ff00df5e65921dc06a8b258e1a3997ede Mon Sep 17 00:00:00 2001 From: raghav-rama Date: Thu, 11 Apr 2024 01:37:19 +0530 Subject: [PATCH] feat: add a unix socket server --- src/bin/unix_socket.rs | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/bin/unix_socket.rs diff --git a/src/bin/unix_socket.rs b/src/bin/unix_socket.rs new file mode 100644 index 0000000..e68c53c --- /dev/null +++ b/src/bin/unix_socket.rs @@ -0,0 +1,49 @@ +use hyper::{service::service_fn, Response}; +use hyper_util::rt::TokioIo; +use std::{error::Error, fs, path::Path}; +use tokio::net::UnixListener; + +const PHRASE: &str = "It's a Unix system. I know this.\n"; + +// Adapted from https://hyper.rs/guides/1/server/hello-world/ +#[tokio::main] +async fn main() -> Result<(), Box> { + let path = Path::new("/tmp/hyperlocal.sock"); + + if path.exists() { + fs::remove_file(path)?; + } + + let listener = UnixListener::bind(path)?; + + println!("Listening for connections at {}.", path.display()); + + loop { + let (stream, _) = listener.accept().await?; + let io = TokioIo::new(stream); + + println!("Accepting connection."); + + tokio::task::spawn(async move { + let svc_fn = service_fn(|_req| async { + let body = PHRASE.to_string(); + Ok::<_, hyper::Error>(Response::new(body)) + }); + + match hyper::server::conn::http1::Builder::new() + // On OSX, disabling keep alive prevents serve_connection from + // blocking and later returning an Err derived from E_NOTCONN. + .keep_alive(false) + .serve_connection(io, svc_fn) + .await + { + Ok(()) => { + println!("Accepted connection."); + } + Err(err) => { + eprintln!("Failed to accept connection: {err:?}"); + } + }; + }); + } +}