use hyper::{Body, Request as HyperRequest, Response as HyperResponse}; use std::task::{Context, Poll}; use tonic::{ body::BoxBody, transport::{NamedService, Server}, Request, Response, Status, }; use tower::Service; use hello_world::greeter_server::{Greeter, GreeterServer}; use hello_world::{HelloReply, HelloRequest}; pub mod hello_world { tonic::include_proto!("helloworld"); } #[derive(Default)] pub struct MyGreeter {} #[tonic::async_trait] impl Greeter for MyGreeter { async fn say_hello( &self, request: Request, ) -> Result, Status> { println!("Got a request from {:?}", request.remote_addr()); let reply = hello_world::HelloReply { message: format!("Hello {}!", request.into_inner().name), }; Ok(Response::new(reply)) } } #[tokio::main] async fn main() -> Result<(), Box> { let addr = "[::1]:50051".parse().unwrap(); let greeter = MyGreeter::default(); println!("GreeterServer listening on {}", addr); let svc = InterceptedService { inner: GreeterServer::new(greeter), }; Server::builder().add_service(svc).serve(addr).await?; Ok(()) } #[derive(Debug, Clone)] struct InterceptedService { inner: S, } impl Service> for InterceptedService where S: Service, Response = HyperResponse> + NamedService + Clone + Send + 'static, S::Future: Send + 'static, { type Response = S::Response; type Error = S::Error; type Future = futures::future::BoxFuture<'static, Result>; fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { self.inner.poll_ready(cx) } fn call(&mut self, req: HyperRequest) -> Self::Future { let mut svc = self.inner.clone(); Box::pin(async move { // Do async work here.... svc.call(req).await }) } } impl NamedService for InterceptedService { const NAME: &'static str = S::NAME; }