@@ -9,16 +9,16 @@ use crate::p3::host::{
99 push_request, push_response,
1010} ;
1111use crate :: p3:: {
12- Body , BodyContext , BodyFrame , ContentLength , DEFAULT_BUFFER_CAPACITY , Request , RequestOptions ,
13- Response , WasiHttp , WasiHttpImpl , WasiHttpView ,
12+ Body , BodyContext , BodyFrame , BodyGuestContents , ContentLength , DEFAULT_BUFFER_CAPACITY ,
13+ Request , RequestOptions , Response , WasiHttp , WasiHttpImpl , WasiHttpView ,
1414} ;
1515use anyhow:: { Context as _, bail} ;
1616use bytes:: { Bytes , BytesMut } ;
1717use core:: future:: Future ;
1818use core:: future:: poll_fn;
1919use core:: mem;
2020use core:: ops:: { Deref , DerefMut } ;
21- use core:: pin:: Pin ;
21+ use core:: pin:: { Pin , pin } ;
2222use core:: str;
2323use core:: task:: Poll ;
2424use futures:: join;
@@ -129,7 +129,7 @@ where
129129 } ;
130130 match body {
131131 Body :: Guest {
132- contents : None ,
132+ contents : BodyGuestContents :: None ,
133133 buffer : Some ( BodyFrame :: Trailers ( Ok ( None ) ) ) | None ,
134134 tx,
135135 content_length : Some ( ContentLength { limit, sent } ) ,
@@ -149,7 +149,7 @@ where
149149 return Ok ( ( ) ) ;
150150 }
151151 Body :: Guest {
152- contents : None ,
152+ contents : BodyGuestContents :: None ,
153153 trailers : Some ( mut trailers_rx) ,
154154 buffer : None ,
155155 tx,
@@ -168,7 +168,7 @@ where
168168 bail ! ( "lock poisoned" ) ;
169169 } ;
170170 * body = Body :: Guest {
171- contents : None ,
171+ contents : BodyGuestContents :: None ,
172172 trailers : Some ( trailers_rx) ,
173173 buffer : None ,
174174 tx,
@@ -182,7 +182,7 @@ where
182182 bail ! ( "lock poisoned" ) ;
183183 } ;
184184 * body = Body :: Guest {
185- contents : None ,
185+ contents : BodyGuestContents :: None ,
186186 trailers : None ,
187187 buffer : Some ( BodyFrame :: Trailers ( res) ) ,
188188 tx,
@@ -194,7 +194,7 @@ where
194194 Ok ( ( ) )
195195 }
196196 Body :: Guest {
197- contents : None ,
197+ contents : BodyGuestContents :: None ,
198198 trailers : None ,
199199 buffer : Some ( BodyFrame :: Trailers ( res) ) ,
200200 tx,
@@ -206,7 +206,7 @@ where
206206 bail ! ( "lock poisoned" ) ;
207207 } ;
208208 * body = Body :: Guest {
209- contents : None ,
209+ contents : BodyGuestContents :: None ,
210210 trailers : None ,
211211 buffer : Some ( BodyFrame :: Trailers ( res) ) ,
212212 tx,
@@ -218,7 +218,7 @@ where
218218 Ok ( ( ) )
219219 }
220220 Body :: Guest {
221- contents : Some ( mut contents_rx) ,
221+ contents : BodyGuestContents :: Some ( mut contents_rx) ,
222222 trailers : Some ( mut trailers_rx) ,
223223 buffer,
224224 tx,
@@ -235,7 +235,7 @@ where
235235 let pos = buffer. position ( ) . try_into ( ) ?;
236236 let buffer = buffer. into_inner ( ) . split_off ( pos) ;
237237 * body = Body :: Guest {
238- contents : Some ( contents_rx) ,
238+ contents : BodyGuestContents :: Some ( contents_rx) ,
239239 trailers : Some ( trailers_rx) ,
240240 buffer : Some ( BodyFrame :: Data ( buffer) ) ,
241241 tx,
@@ -250,11 +250,13 @@ where
250250 }
251251 let ( contents_tx_drop, mut contents_tx) = contents_tx. watch_reader ( ) ;
252252 let mut contents_tx_drop = Box :: pin ( contents_tx_drop) ;
253+ let mut rx_buffer = BytesMut :: with_capacity ( DEFAULT_BUFFER_CAPACITY ) ;
253254 loop {
254- let Some ( ( rx_tail, mut rx_buffer) ) =
255+ let mut next_chunk = pin ! ( contents_rx. read( rx_buffer) ) ;
256+ let Some ( ( rx_tail, b) ) =
255257 poll_fn ( |cx| match contents_tx_drop. as_mut ( ) . poll ( cx) {
256258 Poll :: Ready ( ( ) ) => return Poll :: Ready ( None ) ,
257- Poll :: Pending => contents_rx . as_mut ( ) . poll ( cx) . map ( Some ) ,
259+ Poll :: Pending => next_chunk . as_mut ( ) . poll ( cx) . map ( Some ) ,
258260 } )
259261 . await
260262 else {
@@ -263,14 +265,18 @@ where
263265 bail ! ( "lock poisoned" ) ;
264266 } ;
265267 * body = Body :: Guest {
266- contents : Some ( contents_rx) ,
268+ // FIXME: cancellation support should be added to
269+ // reads in Wasmtime to fully support this to avoid
270+ // needing `Taken` at all.
271+ contents : BodyGuestContents :: Taken ,
267272 trailers : Some ( trailers_rx) ,
268273 buffer : None ,
269274 tx,
270275 content_length,
271276 } ;
272277 return Ok ( ( ) ) ;
273278 } ;
279+ rx_buffer = b;
274280 let tx_tail = contents_tx. into_inner ( ) ;
275281 let Some ( rx_tail) = rx_tail else {
276282 debug_assert ! ( rx_buffer. is_empty( ) ) ;
@@ -322,7 +328,7 @@ where
322328 }
323329 let buffer = rx_buffer. split ( ) . freeze ( ) ;
324330 rx_buffer. reserve ( DEFAULT_BUFFER_CAPACITY ) ;
325- contents_rx = Box :: pin ( rx_tail. read ( rx_buffer ) ) ;
331+ contents_rx = rx_tail;
326332 let ( tx_tail, buffer) = tx_tail. write_all ( Cursor :: new ( buffer) ) . await ;
327333 let Some ( tx_tail) = tx_tail else {
328334 let Ok ( mut body) = self . body . lock ( ) else {
@@ -331,7 +337,7 @@ where
331337 let pos = buffer. position ( ) . try_into ( ) ?;
332338 let buffer = buffer. into_inner ( ) . split_off ( pos) ;
333339 * body = Body :: Guest {
334- contents : Some ( contents_rx) ,
340+ contents : BodyGuestContents :: Some ( contents_rx) ,
335341 trailers : Some ( trailers_rx) ,
336342 buffer : Some ( BodyFrame :: Data ( buffer) ) ,
337343 tx,
@@ -356,7 +362,7 @@ where
356362 bail ! ( "lock poisoned" ) ;
357363 } ;
358364 * body = Body :: Guest {
359- contents : None ,
365+ contents : BodyGuestContents :: None ,
360366 trailers : Some ( trailers_rx) ,
361367 buffer : None ,
362368 tx,
@@ -370,7 +376,7 @@ where
370376 bail ! ( "lock poisoned" ) ;
371377 } ;
372378 * body = Body :: Guest {
373- contents : None ,
379+ contents : BodyGuestContents :: None ,
374380 trailers : None ,
375381 buffer : Some ( BodyFrame :: Trailers ( res) ) ,
376382 tx,
@@ -751,11 +757,10 @@ where
751757 let ( res_tx, res_rx) = instance
752758 . future ( || Ok ( ( ) ) , & mut view)
753759 . context ( "failed to create future" ) ?;
754- let contents = contents. map ( |contents| {
755- contents
756- . into_reader ( & mut view)
757- . read ( BytesMut :: with_capacity ( DEFAULT_BUFFER_CAPACITY ) )
758- } ) ;
760+ let contents = match contents {
761+ Some ( contents) => BodyGuestContents :: Some ( contents. into_reader ( & mut view) ) ,
762+ None => BodyGuestContents :: None ,
763+ } ;
759764 let trailers = trailers. into_reader ( & mut view) . read ( ) ;
760765 let mut binding = view. get ( ) ;
761766 let table = binding. table ( ) ;
@@ -769,7 +774,7 @@ where
769774 } )
770775 . transpose ( ) ?;
771776 let body = Body :: Guest {
772- contents : contents . map ( |v| Box :: pin ( v ) as _ ) ,
777+ contents,
773778 trailers : Some ( Box :: pin ( trailers) ) ,
774779 buffer : None ,
775780 tx : res_tx,
@@ -1077,19 +1082,18 @@ where
10771082 let ( res_tx, res_rx) = instance
10781083 . future ( || Ok ( ( ) ) , & mut view)
10791084 . context ( "failed to create future" ) ?;
1080- let contents = contents. map ( |contents| {
1081- contents
1082- . into_reader ( & mut view)
1083- . read ( BytesMut :: with_capacity ( DEFAULT_BUFFER_CAPACITY ) )
1084- } ) ;
1085+ let contents = match contents {
1086+ Some ( contents) => BodyGuestContents :: Some ( contents. into_reader ( & mut view) ) ,
1087+ None => BodyGuestContents :: None ,
1088+ } ;
10851089 let trailers = trailers. into_reader ( & mut view) . read ( ) ;
10861090 let mut binding = view. get ( ) ;
10871091 let table = binding. table ( ) ;
10881092 let headers = delete_fields ( table, headers) ?;
10891093 let headers = headers. unwrap_or_clone ( ) ?;
10901094 let content_length = get_content_length ( & headers) ?;
10911095 let body = Body :: Guest {
1092- contents : contents . map ( |v| Box :: pin ( v ) as _ ) ,
1096+ contents,
10931097 trailers : Some ( Box :: pin ( trailers) ) ,
10941098 buffer : None ,
10951099 tx : res_tx,
0 commit comments