softprops / hyperlocal

🔌 ✨rustlang hyper bindings for local unix domain sockets
MIT License
227 stars 46 forks source link

Work greetly with axum, but not required in hyper 1.0 #64

Open danielecr opened 8 months ago

danielecr commented 8 months ago

I do not know why I spent all this morning for just open a unix socket, anyway, the full example ported from TcpListener to UnixListener:

use bytes::Bytes;
use http_body_util::Full;

use hyper::server::conn::http1;
use hyper::service::service_fn;
use hyper::{Request, Response};
use tokio::net::{TcpListener,UnixListener};
use hyper_util::rt::TokioIo;

use std::convert::Infallible;

async fn hello(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
    Ok(Response::new(Full::new(Bytes::from("Hello, World!"))))
}

#[tokio::main]
async fn main() {
    let socketpath = "/tmp/notexistent.sock";
    let path = std::path::Path::new(socketpath);

    if path.exists() {
        tokio::fs::remove_file(path).await.expect("Could not remove old socket!");
    }

    let listener = UnixListener::bind(path).unwrap();

    //let listener = TcpListener::bind(addr).await.unwrap();
    loop {
        let (stream, _) = listener.accept().await.unwrap();
        let io = TokioIo::new(stream);

        tokio::task::spawn(async move {
            if let Err(err) = // http1::Builder::new()
            http1::Builder::new().serve_connection(
                io,
                service_fn(hello),
            )
            .await
            {
                println!("Failed to serve connection: {:?}", err);
            }
        });
    }
}

try with:

curl --no-buffer -XGET --unix-socket /tmp/notexistent.sock http://domain/saysomething

I refer to the example in https://hyper.rs/guides/1/server/hello-world/

danielecr commented 8 months ago

https://github.com/hyperium/hyper/pull/3440 let's see

bheesham commented 7 months ago

fwiw there's a client+server example here: https://github.com/tokio-rs/axum/blob/main/examples/unix-domain-socket/src/main.rs