Skip to content

Commit 7dc4731

Browse files
committed
examples: add client example for tonic-reflection
This adds an example usage of the `ServerReflectionClient` using a `ListServices` request. Fixes: hyperium#1600
1 parent 177c1f3 commit 7dc4731

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

examples/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ name = "health-server"
164164
path = "src/health/server.rs"
165165
required-features = ["health"]
166166

167+
[[bin]]
168+
name = "reflection-client"
169+
path = "src/reflection/client.rs"
170+
required-features = ["reflection"]
171+
167172
[[bin]]
168173
name = "reflection-server"
169174
path = "src/reflection/server.rs"

examples/src/reflection/client.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
use tokio_stream::StreamExt;
2+
use tonic_reflection::pb::{
3+
server_reflection_client::ServerReflectionClient, server_reflection_request::MessageRequest,
4+
server_reflection_response::MessageResponse, ServerReflectionRequest, ServerReflectionResponse,
5+
};
6+
7+
fn parse_response(resp: ServerReflectionResponse) {
8+
let message_response = resp.message_response.expect("message response");
9+
10+
if let MessageResponse::ListServicesResponse(list_response) = message_response {
11+
for svc in list_response.service {
12+
println!("\tfound service: `{}`", svc.name);
13+
}
14+
}
15+
}
16+
17+
#[tokio::main]
18+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
19+
let conn = tonic::transport::Endpoint::new("http://[::1]:50052")?
20+
.connect()
21+
.await?;
22+
23+
let mut client = ServerReflectionClient::new(conn);
24+
25+
let list_services_request = ServerReflectionRequest {
26+
host: "host".into(),
27+
message_request: Some(MessageRequest::ListServices("list".into())),
28+
};
29+
30+
let request_stream = tokio_stream::once(list_services_request);
31+
let mut inbound = client
32+
.server_reflection_info(request_stream)
33+
.await?
34+
.into_inner();
35+
36+
while let Some(recv) = inbound.next().await {
37+
match recv {
38+
Ok(resp) => parse_response(resp),
39+
Err(e) => println!("\tdid not receive response due to error: `{}`", e),
40+
}
41+
}
42+
43+
Ok(())
44+
}

0 commit comments

Comments
 (0)