@@ -23,11 +23,11 @@ use tokio::sync::{Mutex, oneshot};
2323use tokio:: task:: JoinHandle ;
2424use crossbeam_channel;
2525
26- use hyper:: server:: conn:: http1;
2726use hyper:: service:: service_fn;
2827use hyper:: { Error , Request as HyperRequest , Response as HyperResponse , StatusCode } ;
2928use hyper:: body:: Incoming ;
3029use hyper_util:: rt:: TokioIo ;
30+ use hyper_util:: server:: conn:: auto;
3131use http_body_util:: BodyExt ; // You'll need this
3232use http_body_util:: Full ;
3333
@@ -177,20 +177,10 @@ impl Server {
177177
178178 loop {
179179 let ( stream, _) = listener. accept ( ) . await . unwrap ( ) ;
180- let io = TokioIo :: new ( stream) ;
181180 let work_tx = work_tx. clone ( ) ;
182181
183182 tokio:: task:: spawn ( async move {
184- let service = service_fn ( move |req : HyperRequest < Incoming > | {
185- let work_tx = work_tx. clone ( ) ;
186- handle_request ( req, work_tx)
187- } ) ;
188-
189- if let Err ( err) = http1:: Builder :: new ( )
190- . serve_connection ( io, service)
191- . await {
192- eprintln ! ( "Error serving connection: {:?}" , err) ;
193- }
183+ handle_connection ( stream, work_tx) . await ;
194184 } ) ;
195185 }
196186 } else {
@@ -200,20 +190,10 @@ impl Server {
200190
201191 loop {
202192 let ( stream, _) = listener. accept ( ) . await . unwrap ( ) ;
203- let io = TokioIo :: new ( stream) ;
204193 let work_tx = work_tx. clone ( ) ;
205194
206195 tokio:: task:: spawn ( async move {
207- let service = service_fn ( move |req : HyperRequest < Incoming > | {
208- let work_tx = work_tx. clone ( ) ;
209- handle_request ( req, work_tx)
210- } ) ;
211-
212- if let Err ( err) = http1:: Builder :: new ( )
213- . serve_connection ( io, service)
214- . await {
215- eprintln ! ( "Error serving connection: {:?}" , err) ;
216- }
196+ handle_connection ( stream, work_tx) . await ;
217197 } ) ;
218198 }
219199 }
@@ -294,6 +274,25 @@ async fn handle_request(
294274 }
295275}
296276
277+ async fn handle_connection (
278+ stream : impl tokio:: io:: AsyncRead + tokio:: io:: AsyncWrite + Unpin + Send + ' static ,
279+ work_tx : Arc < crossbeam_channel:: Sender < RequestWithCompletion > > ,
280+ ) {
281+ let service = service_fn ( move |req : HyperRequest < Incoming > | {
282+ let work_tx = work_tx. clone ( ) ;
283+ handle_request ( req, work_tx)
284+ } ) ;
285+
286+ let io = TokioIo :: new ( stream) ;
287+
288+ if let Err ( err) = auto:: Builder :: new ( hyper_util:: rt:: TokioExecutor :: new ( ) )
289+ . serve_connection ( io, service)
290+ . await
291+ {
292+ eprintln ! ( "Error serving connection: {:?}" , err) ;
293+ }
294+ }
295+
297296#[ magnus:: init]
298297fn init ( ruby : & Ruby ) -> Result < ( ) , MagnusError > {
299298 let module = ruby. define_module ( "HyperRuby" ) ?;
0 commit comments