xref: /tonic/examples/src/tls/server.rs (revision a562a3ce)
1 pub mod pb {
2     tonic::include_proto!("/grpc.examples.unaryecho");
3 }
4 
5 use pb::{EchoRequest, EchoResponse};
6 use tonic::{
7     transport::{
8         server::{TcpConnectInfo, TlsConnectInfo},
9         Identity, Server, ServerTlsConfig,
10     },
11     Request, Response, Status,
12 };
13 
14 type EchoResult<T> = Result<Response<T>, Status>;
15 
16 #[derive(Default)]
17 pub struct EchoServer;
18 
19 #[tonic::async_trait]
20 impl pb::echo_server::Echo for EchoServer {
21     async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResult<EchoResponse> {
22         let conn_info = request
23             .extensions()
24             .get::<TlsConnectInfo<TcpConnectInfo>>()
25             .unwrap();
26         println!(
27             "Got a request from {:?} with info {:?}",
28             request.remote_addr(),
29             conn_info
30         );
31 
32         let message = request.into_inner().message;
33         Ok(Response::new(EchoResponse { message }))
34     }
35 }
36 
37 #[tokio::main]
38 async fn main() -> Result<(), Box<dyn std::error::Error>> {
39     let cert = tokio::fs::read("examples/data/tls/server.pem").await?;
40     let key = tokio::fs::read("examples/data/tls/server.key").await?;
41 
42     let identity = Identity::from_pem(cert, key);
43 
44     let addr = "[::1]:50051".parse().unwrap();
45     let server = EchoServer::default();
46 
47     Server::builder()
48         .tls_config(ServerTlsConfig::new().identity(identity))?
49         .add_service(pb::echo_server::EchoServer::new(server))
50         .serve(addr)
51         .await?;
52 
53     Ok(())
54 }
55