1 use structopt::StructOpt; 2 use tonic::transport::Server; 3 use tonic::transport::{Identity, ServerTlsConfig}; 4 use tonic_interop::server; 5 6 #[derive(StructOpt)] 7 struct Opts { 8 #[structopt(name = "use_tls", long)] 9 use_tls: bool, 10 } 11 12 #[tokio::main] 13 async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> { 14 tonic_interop::trace_init(); 15 16 let matches = Opts::from_args(); 17 18 let addr = "127.0.0.1:10000".parse().unwrap(); 19 20 let mut builder = Server::builder(); 21 22 if matches.use_tls { 23 let cert = tokio::fs::read("interop/data/server1.pem").await?; 24 let key = tokio::fs::read("interop/data/server1.key").await?; 25 let identity = Identity::from_pem(cert, key); 26 27 builder = builder.tls_config(ServerTlsConfig::new().identity(identity)); 28 } 29 30 let test_service = server::TestServiceServer::new(server::TestService::default()); 31 let unimplemented_service = 32 server::UnimplementedServiceServer::new(server::UnimplementedService::default()); 33 34 // Wrap this test_service with a service that will echo headers as trailers. 35 let test_service_svc = server::EchoHeadersSvc::new(test_service); 36 37 builder 38 .add_service(test_service_svc) 39 .add_service(unimplemented_service) 40 .serve(addr) 41 .await?; 42 43 Ok(()) 44 } 45