xref: /tonic/examples/src/tls/server.rs (revision da92dbf8)
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::{Identity, Server, ServerTlsConfig},
10     Request, Response, Status, Streaming,
11 };
12 
13 type EchoResult<T> = Result<Response<T>, Status>;
14 type ResponseStream = Pin<Box<dyn Stream<Item = Result<EchoResponse, Status>> + Send + Sync>>;
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 message = request.into_inner().message;
23         Ok(Response::new(EchoResponse { message }))
24     }
25 
26     type ServerStreamingEchoStream = ResponseStream;
27 
28     async fn server_streaming_echo(
29         &self,
30         _: Request<EchoRequest>,
31     ) -> EchoResult<Self::ServerStreamingEchoStream> {
32         Err(Status::unimplemented("not implemented"))
33     }
34 
35     async fn client_streaming_echo(
36         &self,
37         _: Request<Streaming<EchoRequest>>,
38     ) -> EchoResult<EchoResponse> {
39         Err(Status::unimplemented("not implemented"))
40     }
41 
42     type BidirectionalStreamingEchoStream = ResponseStream;
43 
44     async fn bidirectional_streaming_echo(
45         &self,
46         _: Request<Streaming<EchoRequest>>,
47     ) -> EchoResult<Self::BidirectionalStreamingEchoStream> {
48         Err(Status::unimplemented("not implemented"))
49     }
50 }
51 
52 #[tokio::main]
53 async fn main() -> Result<(), Box<dyn std::error::Error>> {
54     let cert = tokio::fs::read("examples/data/tls/server.pem").await?;
55     let key = tokio::fs::read("examples/data/tls/server.key").await?;
56 
57     let identity = Identity::from_pem(cert, key);
58 
59     let addr = "[::1]:50051".parse().unwrap();
60     let server = EchoServer::default();
61 
62     Server::builder()
63         .tls_config(ServerTlsConfig::new().identity(identity))
64         .add_service(pb::echo_server::EchoServer::new(server))
65         .serve(addr)
66         .await?;
67 
68     Ok(())
69 }
70