1 pub mod pb {
2     tonic::include_proto!("grpc.examples.echo");
3 }
4 
5 use futures::Stream;
6 use pb::{EchoRequest, EchoResponse};
7 use std::pin::Pin;
8 use tonic::transport::{Certificate, Identity, Server, ServerTlsConfig};
9 use tonic::{Request, Response, Status};
10 
11 type EchoResult<T> = Result<Response<T>, Status>;
12 type ResponseStream = Pin<Box<dyn Stream<Item = Result<EchoResponse, Status>> + Send + Sync>>;
13 
14 #[derive(Default)]
15 pub struct EchoServer;
16 
17 #[tonic::async_trait]
18 impl pb::echo_server::Echo for EchoServer {
19     async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResult<EchoResponse> {
20         let certs = request
21             .peer_certs()
22             .expect("Client did not send its certs!");
23 
24         println!("Got {} peer certs!", certs.len());
25 
26         let message = request.into_inner().message;
27         Ok(Response::new(EchoResponse { message }))
28     }
29 
30     type ServerStreamingEchoStream = ResponseStream;
31 
32     async fn server_streaming_echo(
33         &self,
34         _: Request<EchoRequest>,
35     ) -> Result<Response<Self::ServerStreamingEchoStream>, Status> {
36         Err(Status::unimplemented("Not yet implemented"))
37     }
38 
39     async fn client_streaming_echo(
40         &self,
41         _: Request<tonic::Streaming<EchoRequest>>,
42     ) -> Result<Response<EchoResponse>, Status> {
43         Err(Status::unimplemented("Not yet implemented"))
44     }
45 
46     type BidirectionalStreamingEchoStream = ResponseStream;
47 
48     async fn bidirectional_streaming_echo(
49         &self,
50         _: Request<tonic::Streaming<EchoRequest>>,
51     ) -> Result<Response<Self::BidirectionalStreamingEchoStream>, Status> {
52         Err(Status::unimplemented("Not yet implemented"))
53     }
54 }
55 
56 #[tokio::main]
57 async fn main() -> Result<(), Box<dyn std::error::Error>> {
58     let cert = tokio::fs::read("examples/data/tls/server.pem").await?;
59     let key = tokio::fs::read("examples/data/tls/server.key").await?;
60     let server_identity = Identity::from_pem(cert, key);
61 
62     let client_ca_cert = tokio::fs::read("examples/data/tls/client_ca.pem").await?;
63     let client_ca_cert = Certificate::from_pem(client_ca_cert);
64 
65     let addr = "[::1]:50051".parse().unwrap();
66     let server = EchoServer::default();
67 
68     let tls = ServerTlsConfig::new()
69         .identity(server_identity)
70         .client_ca_root(client_ca_cert);
71 
72     Server::builder()
73         .tls_config(tls)?
74         .add_service(pb::echo_server::EchoServer::new(server))
75         .serve(addr)
76         .await?;
77 
78     Ok(())
79 }
80