xref: /tonic/examples/src/tls/server.rs (revision 380d81dd)
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::{
9     transport::{
10         server::{TcpConnectInfo, TlsConnectInfo},
11         Identity, Server, ServerTlsConfig,
12     },
13     Request, Response, Status, Streaming,
14 };
15 
16 type EchoResult<T> = Result<Response<T>, Status>;
17 type ResponseStream = Pin<Box<dyn Stream<Item = Result<EchoResponse, Status>> + Send + Sync>>;
18 
19 #[derive(Default)]
20 pub struct EchoServer;
21 
22 #[tonic::async_trait]
23 impl pb::echo_server::Echo for EchoServer {
24     async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResult<EchoResponse> {
25         let conn_info = request
26             .extensions()
27             .get::<TlsConnectInfo<TcpConnectInfo>>()
28             .unwrap();
29         println!(
30             "Got a request from {:?} with info {:?}",
31             request.remote_addr(),
32             conn_info
33         );
34 
35         let message = request.into_inner().message;
36         Ok(Response::new(EchoResponse { message }))
37     }
38 
39     type ServerStreamingEchoStream = ResponseStream;
40 
41     async fn server_streaming_echo(
42         &self,
43         _: Request<EchoRequest>,
44     ) -> EchoResult<Self::ServerStreamingEchoStream> {
45         Err(Status::unimplemented("not implemented"))
46     }
47 
48     async fn client_streaming_echo(
49         &self,
50         _: Request<Streaming<EchoRequest>>,
51     ) -> EchoResult<EchoResponse> {
52         Err(Status::unimplemented("not implemented"))
53     }
54 
55     type BidirectionalStreamingEchoStream = ResponseStream;
56 
57     async fn bidirectional_streaming_echo(
58         &self,
59         _: Request<Streaming<EchoRequest>>,
60     ) -> EchoResult<Self::BidirectionalStreamingEchoStream> {
61         Err(Status::unimplemented("not implemented"))
62     }
63 }
64 
65 #[tokio::main]
66 async fn main() -> Result<(), Box<dyn std::error::Error>> {
67     let cert = tokio::fs::read("examples/data/tls/server.pem").await?;
68     let key = tokio::fs::read("examples/data/tls/server.key").await?;
69 
70     let identity = Identity::from_pem(cert, key);
71 
72     let addr = "[::1]:50051".parse().unwrap();
73     let server = EchoServer::default();
74 
75     Server::builder()
76         .tls_config(ServerTlsConfig::new().identity(identity))?
77         .add_service(pb::echo_server::EchoServer::new(server))
78         .serve(addr)
79         .await?;
80 
81     Ok(())
82 }
83