@@ -12,6 +12,7 @@ use hyper_util::{
1212 server:: conn:: auto:: Builder ,
1313} ;
1414use std:: {
15+ fmt,
1516 io:: { self , ErrorKind } ,
1617 net:: SocketAddr ,
1718 time:: Duration ,
@@ -22,13 +23,27 @@ use tokio::{
2223} ;
2324
2425/// HTTP server.
25- #[ derive( Debug ) ]
2626pub struct Server < A = DefaultAcceptor > {
2727 acceptor : A ,
28+ builder : Builder < TokioExecutor > ,
2829 listener : Listener ,
2930 handle : Handle ,
3031}
3132
33+ // Builder doesn't implement Debug or Clone right now
34+ impl < A > fmt:: Debug for Server < A >
35+ where
36+ A : fmt:: Debug ,
37+ {
38+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
39+ f. debug_struct ( "Server" )
40+ . field ( "acceptor" , & self . acceptor )
41+ . field ( "listener" , & self . listener )
42+ . field ( "handle" , & self . handle )
43+ . finish_non_exhaustive ( )
44+ }
45+ }
46+
3247#[ derive( Debug ) ]
3348enum Listener {
3449 Bind ( SocketAddr ) ,
@@ -49,10 +64,12 @@ impl Server {
4964 /// Create a server that will bind to provided address.
5065 pub fn bind ( addr : SocketAddr ) -> Self {
5166 let acceptor = DefaultAcceptor :: new ( ) ;
67+ let builder = Builder :: new ( TokioExecutor :: new ( ) ) ;
5268 let handle = Handle :: new ( ) ;
5369
5470 Self {
5571 acceptor,
72+ builder,
5673 listener : Listener :: Bind ( addr) ,
5774 handle,
5875 }
@@ -61,10 +78,12 @@ impl Server {
6178 /// Create a server from existing `std::net::TcpListener`.
6279 pub fn from_tcp ( listener : std:: net:: TcpListener ) -> Self {
6380 let acceptor = DefaultAcceptor :: new ( ) ;
81+ let builder = Builder :: new ( TokioExecutor :: new ( ) ) ;
6482 let handle = Handle :: new ( ) ;
6583
6684 Self {
6785 acceptor,
86+ builder,
6887 listener : Listener :: Std ( listener) ,
6988 handle,
7089 }
@@ -76,6 +95,7 @@ impl<A> Server<A> {
7695 pub fn acceptor < Acceptor > ( self , acceptor : Acceptor ) -> Server < Acceptor > {
7796 Server {
7897 acceptor,
98+ builder : self . builder ,
7999 listener : self . listener ,
80100 handle : self . handle ,
81101 }
@@ -88,6 +108,7 @@ impl<A> Server<A> {
88108 {
89109 Server {
90110 acceptor : acceptor ( self . acceptor ) ,
111+ builder : self . builder ,
91112 listener : self . listener ,
92113 handle : self . handle ,
93114 }
@@ -103,6 +124,11 @@ impl<A> Server<A> {
103124 & mut self . acceptor
104125 }
105126
127+ /// Returns a mutable reference to the Http builder.
128+ pub fn http_builder ( & mut self ) -> & mut Builder < TokioExecutor > {
129+ & mut self . builder
130+ }
131+
106132 /// Provide a handle for additional utilities.
107133 pub fn handle ( mut self , handle : Handle ) -> Self {
108134 self . handle = handle;
@@ -134,6 +160,7 @@ impl<A> Server<A> {
134160 {
135161 let acceptor = self . acceptor ;
136162 let handle = self . handle ;
163+ let builder = std:: sync:: Arc :: new ( self . builder ) ;
137164
138165 let mut incoming = match bind_incoming ( self . listener ) . await {
139166 Ok ( v) => v,
@@ -164,14 +191,14 @@ impl<A> Server<A> {
164191
165192 let acceptor = acceptor. clone ( ) ;
166193 let watcher = handle. watcher ( ) ;
194+ let builder = builder. clone ( ) ;
167195
168196 tokio:: spawn ( async move {
169197 if let Ok ( ( stream, send_service) ) = acceptor. accept ( tcp_stream, service) . await {
170198 let io = TokioIo :: new ( stream) ;
171199 let service = send_service. into_service ( ) ;
172200 let service = TowerToHyperService :: new ( service) ;
173201
174- let builder = Builder :: new ( TokioExecutor :: new ( ) ) ;
175202 let serve_future = builder. serve_connection_with_upgrades ( io, service) ;
176203 tokio:: pin!( serve_future) ;
177204
0 commit comments