1515 * limitations under the License.
1616 */
1717
18+ use std:: io;
1819use std:: net:: SocketAddr ;
20+ use std:: sync:: Arc ;
1921
2022use futures_core:: Future ;
2123use http:: { Request , Response } ;
2224use hyper:: body:: Body ;
2325use tokio:: time:: Duration ;
2426use tower_service:: Service ;
2527
28+ use tokio_rustls:: rustls:: { Certificate , PrivateKey } ;
29+ use tokio_rustls:: { rustls, TlsAcceptor } ;
30+
2631use super :: listener:: get_listener;
2732use super :: router:: DubboRouter ;
33+ use crate :: triple:: transport:: io:: BoxIO ;
2834use crate :: BoxBody ;
2935
3036#[ derive( Default , Clone , Debug ) ]
@@ -38,6 +44,8 @@ pub struct DubboServer {
3844 http2_keepalive_timeout : Option < Duration > ,
3945 router : DubboRouter ,
4046 listener : Option < String > ,
47+ certs : Vec < Certificate > ,
48+ keys : Vec < PrivateKey > ,
4149}
4250
4351impl DubboServer {
@@ -93,6 +101,14 @@ impl DubboServer {
93101 ..self
94102 }
95103 }
104+
105+ pub fn with_tls ( self , certs : Vec < Certificate > , keys : Vec < PrivateKey > ) -> Self {
106+ Self {
107+ certs : certs,
108+ keys : keys,
109+ ..self
110+ }
111+ }
96112}
97113
98114impl DubboServer {
@@ -107,6 +123,8 @@ impl DubboServer {
107123 max_frame_size : None ,
108124 router : DubboRouter :: new ( ) ,
109125 listener : None ,
126+ certs : Vec :: new ( ) ,
127+ keys : Vec :: new ( ) ,
110128 }
111129 }
112130}
@@ -147,10 +165,25 @@ impl DubboServer {
147165 None => {
148166 return Err ( Box :: new ( crate :: status:: DubboError :: new (
149167 "listener name is empty" . to_string ( ) ,
150- ) ) )
168+ ) ) ) ;
151169 }
152170 } ;
153171
172+ let acceptor: Option < TlsAcceptor > ;
173+ if self . certs . len ( ) != 0 && !self . keys . len ( ) != 0 {
174+ let mut keys = self . keys ;
175+
176+ let config = rustls:: ServerConfig :: builder ( )
177+ . with_safe_defaults ( )
178+ . with_no_client_auth ( )
179+ . with_single_cert ( self . certs , keys. remove ( 0 ) )
180+ . map_err ( |err| io:: Error :: new ( io:: ErrorKind :: InvalidInput , err) ) ?;
181+
182+ acceptor = Some ( TlsAcceptor :: from ( Arc :: new ( config) ) ) ;
183+ } else {
184+ acceptor = None ;
185+ }
186+
154187 let listener = match get_listener ( name, addr) . await {
155188 Ok ( v) => v,
156189 Err ( err) => return Err ( err) ,
@@ -166,6 +199,14 @@ impl DubboServer {
166199 match res {
167200 Ok ( conn) => {
168201 let ( io, local_addr) = conn;
202+ let b : BoxIO ;
203+
204+ if !acceptor. is_none( ) {
205+ b = BoxIO :: new( acceptor. as_ref( ) . unwrap( ) . clone( ) . accept( io) . await ?) ;
206+ } else {
207+ b = io;
208+ }
209+
169210 tracing:: debug!( "hyper serve, local address: {:?}" , local_addr) ;
170211 let c = hyper:: server:: conn:: Http :: new( )
171212 . http2_only( self . accept_http2)
@@ -175,10 +216,9 @@ impl DubboServer {
175216 . http2_keep_alive_interval( self . http2_keepalive_interval)
176217 . http2_keep_alive_timeout( http2_keepalive_timeout)
177218 . http2_max_frame_size( self . max_frame_size)
178- . serve_connection( io , svc. clone( ) ) . with_upgrades( ) ;
219+ . serve_connection( b , svc. clone( ) ) . with_upgrades( ) ;
179220
180221 tokio:: spawn( c) ;
181-
182222 } ,
183223 Err ( err) => tracing:: error!( "hyper serve, err: {:?}" , err) ,
184224 }
0 commit comments