1 pub mod pb {
2 tonic::include_proto!("grpc.examples.unaryecho");
3 }
4
5 use pb::{EchoRequest, EchoResponse};
6 use tonic::{metadata::MetadataValue, transport::Server, Request, Response, Status};
7
8 type EchoResult<T> = Result<Response<T>, Status>;
9
10 #[derive(Default)]
11 pub struct EchoServer {}
12
13 #[tonic::async_trait]
14 impl pb::echo_server::Echo for EchoServer {
unary_echo(&self, request: Request<EchoRequest>) -> EchoResult<EchoResponse>15 async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResult<EchoResponse> {
16 let message = request.into_inner().message;
17 Ok(Response::new(EchoResponse { message }))
18 }
19 }
20
21 #[tokio::main]
main() -> Result<(), Box<dyn std::error::Error>>22 async fn main() -> Result<(), Box<dyn std::error::Error>> {
23 let addr = "[::1]:50051".parse().unwrap();
24 let server = EchoServer::default();
25
26 let svc = pb::echo_server::EchoServer::with_interceptor(server, check_auth);
27
28 Server::builder().add_service(svc).serve(addr).await?;
29
30 Ok(())
31 }
32
check_auth(req: Request<()>) -> Result<Request<()>, Status>33 fn check_auth(req: Request<()>) -> Result<Request<()>, Status> {
34 let token: MetadataValue<_> = "Bearer some-secret-token".parse().unwrap();
35
36 match req.metadata().get("authorization") {
37 Some(t) if token == t => Ok(req),
38 _ => Err(Status::unauthenticated("No valid auth token")),
39 }
40 }
41