@@ -51,7 +51,6 @@ use crate::*;
5151
5252mod kex;
5353mod session;
54- pub use self :: kex:: * ;
5554pub use self :: session:: * ;
5655mod encrypted;
5756
@@ -525,80 +524,81 @@ pub trait Handler: Sized {
525524 }
526525}
527526
527+ #[ async_trait]
528528/// Trait used to create new handlers when clients connect.
529529pub trait Server {
530530 /// The type of handlers.
531- type Handler : Handler + Send ;
531+ type Handler : Handler + Send + ' static ;
532532 /// Called when a new client connects.
533533 fn new_client ( & mut self , peer_addr : Option < std:: net:: SocketAddr > ) -> Self :: Handler ;
534534 /// Called when an active connection fails.
535535 fn handle_session_error ( & mut self , _error : <Self :: Handler as Handler >:: Error ) { }
536- }
537536
538- /// Run a server on a specified `tokio::net::TcpListener`. Useful when dropping
539- /// privileges immediately after socket binding, for example.
540- pub async fn run_on_socket < H : Server + Send + ' static > (
541- config : Arc < Config > ,
542- socket : & TcpListener ,
543- server : & mut H ,
544- ) -> Result < ( ) , std:: io:: Error > {
545- if config. maximum_packet_size > 65535 {
546- error ! (
547- "Maximum packet size ({:?}) should not larger than a TCP packet (65535)" ,
548- config. maximum_packet_size
549- ) ;
550- }
551-
552- let ( error_tx, mut error_rx) = tokio:: sync:: mpsc:: unbounded_channel ( ) ;
553-
554- loop {
555- tokio:: select! {
556- accept_result = socket. accept( ) => {
557- match accept_result {
558- Ok ( ( socket, _) ) => {
559- let config = config. clone( ) ;
560- let handler = server. new_client( socket. peer_addr( ) . ok( ) ) ;
561- let error_tx = error_tx. clone( ) ;
562- tokio:: spawn( async move {
563- let session = match run_stream( config, socket, handler) . await {
564- Ok ( s) => s,
565- Err ( e) => {
566- debug!( "Connection setup failed" ) ;
567- let _ = error_tx. send( e) ;
568- return
569- }
570- } ;
571- match session. await {
572- Ok ( _) => debug!( "Connection closed" ) ,
573- Err ( e) => {
574- debug!( "Connection closed with error" ) ;
575- let _ = error_tx. send( e) ;
537+ /// Run a server on a specified `tokio::net::TcpListener`. Useful when dropping
538+ /// privileges immediately after socket binding, for example.
539+ async fn run_on_socket (
540+ & mut self ,
541+ config : Arc < Config > ,
542+ socket : & TcpListener ,
543+ ) -> Result < ( ) , std:: io:: Error > {
544+ if config. maximum_packet_size > 65535 {
545+ error ! (
546+ "Maximum packet size ({:?}) should not larger than a TCP packet (65535)" ,
547+ config. maximum_packet_size
548+ ) ;
549+ }
550+
551+ let ( error_tx, mut error_rx) = tokio:: sync:: mpsc:: unbounded_channel ( ) ;
552+
553+ loop {
554+ tokio:: select! {
555+ accept_result = socket. accept( ) => {
556+ match accept_result {
557+ Ok ( ( socket, _) ) => {
558+ let config = config. clone( ) ;
559+ let handler = self . new_client( socket. peer_addr( ) . ok( ) ) ;
560+ let error_tx = error_tx. clone( ) ;
561+ tokio:: spawn( async move {
562+ let session = match run_stream( config, socket, handler) . await {
563+ Ok ( s) => s,
564+ Err ( e) => {
565+ debug!( "Connection setup failed" ) ;
566+ let _ = error_tx. send( e) ;
567+ return
568+ }
569+ } ;
570+ match session. await {
571+ Ok ( _) => debug!( "Connection closed" ) ,
572+ Err ( e) => {
573+ debug!( "Connection closed with error" ) ;
574+ let _ = error_tx. send( e) ;
575+ }
576576 }
577- }
578- } ) ;
577+ } ) ;
578+ }
579+ _ => break ,
579580 }
580- _ => break ,
581+ } ,
582+ Some ( error) = error_rx. recv( ) => {
583+ self . handle_session_error( error) ;
581584 }
582- } ,
583- Some ( error) = error_rx. recv( ) => {
584- server. handle_session_error( error) ;
585585 }
586586 }
587- }
588587
589- Ok ( ( ) )
590- }
588+ Ok ( ( ) )
589+ }
591590
592- /// Run a server.
593- /// Create a new `Connection` from the server's configuration, a
594- /// stream and a [`Handler`](trait.Handler.html).
595- pub async fn run < H : Server + Send + ' static , A : ToSocketAddrs > (
596- config : Arc < Config > ,
597- addrs : A ,
598- server : & mut H ,
599- ) -> Result < ( ) , std:: io:: Error > {
600- let socket = TcpListener :: bind ( addrs) . await ?;
601- run_on_socket ( config, & socket, server) . await
591+ /// Run a server.
592+ /// Create a new `Connection` from the server's configuration, a
593+ /// stream and a [`Handler`](trait.Handler.html).
594+ async fn run_on_address < A : ToSocketAddrs + Send > (
595+ & mut self ,
596+ config : Arc < Config > ,
597+ addrs : A ,
598+ ) -> Result < ( ) , std:: io:: Error > {
599+ let socket = TcpListener :: bind ( addrs) . await ?;
600+ self . run_on_socket ( config, & socket) . await
601+ }
602602}
603603
604604use std:: cell:: RefCell ;
0 commit comments