From 7dc47311ee3f214e8c0c750ea19b23d7be1328dc Mon Sep 17 00:00:00 2001 From: grottohub Date: Fri, 12 Jan 2024 17:09:26 -0600 Subject: [PATCH] examples: add client example for `tonic-reflection` This adds an example usage of the `ServerReflectionClient` using a `ListServices` request. Fixes: #1600 --- examples/Cargo.toml | 5 ++++ examples/src/reflection/client.rs | 44 +++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 examples/src/reflection/client.rs diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 5c3e7e8b5..a214a9aef 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -164,6 +164,11 @@ name = "health-server" path = "src/health/server.rs" required-features = ["health"] +[[bin]] +name = "reflection-client" +path = "src/reflection/client.rs" +required-features = ["reflection"] + [[bin]] name = "reflection-server" path = "src/reflection/server.rs" diff --git a/examples/src/reflection/client.rs b/examples/src/reflection/client.rs new file mode 100644 index 000000000..e004bf2ac --- /dev/null +++ b/examples/src/reflection/client.rs @@ -0,0 +1,44 @@ +use tokio_stream::StreamExt; +use tonic_reflection::pb::{ + server_reflection_client::ServerReflectionClient, server_reflection_request::MessageRequest, + server_reflection_response::MessageResponse, ServerReflectionRequest, ServerReflectionResponse, +}; + +fn parse_response(resp: ServerReflectionResponse) { + let message_response = resp.message_response.expect("message response"); + + if let MessageResponse::ListServicesResponse(list_response) = message_response { + for svc in list_response.service { + println!("\tfound service: `{}`", svc.name); + } + } +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + let conn = tonic::transport::Endpoint::new("http://[::1]:50052")? + .connect() + .await?; + + let mut client = ServerReflectionClient::new(conn); + + let list_services_request = ServerReflectionRequest { + host: "host".into(), + message_request: Some(MessageRequest::ListServices("list".into())), + }; + + let request_stream = tokio_stream::once(list_services_request); + let mut inbound = client + .server_reflection_info(request_stream) + .await? + .into_inner(); + + while let Some(recv) = inbound.next().await { + match recv { + Ok(resp) => parse_response(resp), + Err(e) => println!("\tdid not receive response due to error: `{}`", e), + } + } + + Ok(()) +}