tonic icon indicating copy to clipboard operation
tonic copied to clipboard

Use uds client without TryFrom

Open al8n opened this issue 3 years ago • 1 comments

Is there a way to build a uds channel without use try_from? Is there a way we can directly connect to the socket file? Will Endpoint::try_from panic when the socket address has already been using?

#[cfg(unix)]
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // We will ignore this uri because uds do not use it
    // if your connector does use the uri it will be provided
    // as the request to the `MakeConnection`.
    let channel = Endpoint::try_from("http://[::]:50051")?
        .connect_with_connector(service_fn(|_: Uri| {
            let path = "/tmp/tonic/helloworld";

            // Connect to a Uds socket
            UnixStream::connect(path)
        }))
        .await?;

    let mut client = GreeterClient::new(channel);

    let request = tonic::Request::new(HelloRequest {
        name: "Tonic".into(),
    });

    let response = client.say_hello(request).await?;

    println!("RESPONSE={:?}", response);

    Ok(())
}

al8n avatar Apr 18 '21 17:04 al8n

Is there a way to build a uds channel without use try_from? Is there a way we can directly connect to the socket file?

Not currently but might be reasonable feature to add.

Will Endpoint::try_from panic when the socket address has already been using?

It will not. It just constructs an http::uri::Uri which does no IO.

davidpdrsn avatar May 01 '21 16:05 davidpdrsn

Is there a string that can be provided to Endpoint::try_from() that will be guaranteed to fail such that we can be sure that the UDS file is used? Perahaps "" or "/dev/null". In the GEOPM use case, connecting to another endpoint would be a security concern:

https://github.com/geopm/geopm/pull/2779/files#diff-35aec12ebceeffd53bd51330ff6410403decc38fb1c56b898e9e3a6adece0379R164-R168

Thanks!

cmcantalupo avatar Jan 24 '23 20:01 cmcantalupo