tonic
tonic copied to clipboard
Use uds client without TryFrom
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(())
}
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.
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!