@@ -10,7 +10,7 @@ use gvl_helpers::nogvl;
1010use magnus:: block:: block_proc;
1111use magnus:: r_hash:: ForEach ;
1212use magnus:: typed_data:: Obj ;
13- use magnus:: { function, method, prelude:: * , Error as MagnusError , IntoValue , Ruby , Value } ;
13+ use magnus:: { function, method, prelude:: * , Error as MagnusError , IntoValue , RString , Ruby , Value } ;
1414use bytes:: Bytes ;
1515
1616use std:: cell:: RefCell ;
@@ -46,7 +46,7 @@ impl ServerConfig {
4646
4747// Sent on the work channel with the request, and a oneshot channel to send the response back on.
4848struct RequestWithCompletion {
49- request : Request ,
49+ request : HyperRequest < Bytes > ,
5050 // sent a response back on this thread
5151 response_tx : oneshot:: Sender < HyperResponse < Full < Bytes > > > ,
5252}
@@ -85,13 +85,17 @@ impl Server {
8585 pub fn run_worker ( & self ) -> Result < ( ) , MagnusError > {
8686 let block = block_proc ( ) . unwrap ( ) ;
8787 if let Some ( work_rx) = self . work_rx . borrow ( ) . as_ref ( ) {
88+
8889 loop {
8990 // Use nogvl to wait for requests outside the GVL
9091 let work_request = nogvl ( || work_rx. recv ( ) ) ;
9192
9293 match work_request {
9394 Ok ( work_request) => {
94- let value = unsafe { work_request. request . into_value_unchecked ( ) } ;
95+ let request = Request {
96+ request : work_request. request ,
97+ } ;
98+ let value = request. into_value ( ) ;
9599 let hyper_response = match block. call :: < _ , Value > ( [ value] ) {
96100 Ok ( result) => {
97101 let ref_response = Obj :: < Response > :: try_convert ( result) . unwrap ( ) ;
@@ -253,14 +257,10 @@ async fn handle_request(
253257 let ( parts, body) = req. into_parts ( ) ;
254258 let body_bytes = body. collect ( ) . await ?. to_bytes ( ) ;
255259
256- let request = Request {
257- request : HyperRequest :: from_parts ( parts, body_bytes) ,
258- } ;
259-
260260 let ( response_tx, response_rx) = oneshot:: channel ( ) ;
261261
262262 let with_completion = RequestWithCompletion {
263- request,
263+ request : HyperRequest :: from_parts ( parts , body_bytes ) ,
264264 response_tx,
265265 } ;
266266
@@ -311,7 +311,7 @@ fn init(ruby: &Ruby) -> Result<(), MagnusError> {
311311 request_class. define_method ( "http_method" , method ! ( Request :: method, 0 ) ) ?;
312312 request_class. define_method ( "path" , method ! ( Request :: path, 0 ) ) ?;
313313 request_class. define_method ( "header" , method ! ( Request :: header, 1 ) ) ?;
314- request_class. define_method ( "body " , method ! ( Request :: body , 0 ) ) ?;
314+ request_class. define_method ( "fill_body " , method ! ( Request :: fill_body , 1 ) ) ?;
315315 request_class. define_method ( "body_size" , method ! ( Request :: body_size, 0 ) ) ?;
316316 request_class. define_method ( "inspect" , method ! ( Request :: inspect, 0 ) ) ?;
317317
0 commit comments