22//! implementation of the wasi-http API.
33
44use crate :: {
5- bindings:: http:: types:: { Headers , IncomingBody , Method , Scheme , FutureTrailers } ,
6- body:: { HostIncomingBody , HostFutureTrailers } ,
5+ bindings:: http:: types:: { FutureTrailers , Headers , IncomingBody , Method , Scheme } ,
6+ body:: { HostFutureTrailers , HostIncomingBody } ,
77} ;
8- use std:: collections:: HashMap ;
98use std:: pin:: Pin ;
109use std:: task;
11- use wasmtime_wasi:: preview2:: { pipe:: AsyncReadStream , AbortOnDropJoinHandle , Table , TableError } ;
10+ use std:: { any:: Any , collections:: HashMap } ;
11+ use wasmtime_wasi:: preview2:: { pipe:: AsyncReadStream , AbortOnDropJoinHandle , Table , TableError , OccupiedEntry } ;
1212
1313const MAX_BUF_SIZE : usize = 65_536 ;
1414
@@ -20,14 +20,12 @@ pub trait WasiHttpView: Send {
2020 fn table ( & mut self ) -> & mut Table ;
2121}
2222
23- pub type FieldsMap = HashMap < String , Vec < Vec < u8 > > > ;
24-
2523pub struct HostOutgoingRequest {
2624 pub method : Method ,
2725 pub scheme : Option < Scheme > ,
2826 pub path_with_query : String ,
2927 pub authority : String ,
30- pub headers : HostFields ,
28+ pub headers : FieldMap ,
3129 pub body : Option < AsyncReadStream > ,
3230}
3331
@@ -46,26 +44,15 @@ pub struct HostOutgoingRequest {
4644
4745pub struct HostIncomingResponse {
4846 pub status : u16 ,
49- pub headers : HeadersRef ,
47+ pub headers : FieldMap ,
5048 pub body : Option < hyper:: body:: Incoming > ,
5149 pub worker : AbortOnDropJoinHandle < anyhow:: Result < ( ) > > ,
5250}
5351
54- pub enum HeadersRef {
55- Value ( hyper:: HeaderMap ) ,
56- Resource ( Headers ) ,
57- }
58-
59- #[ derive( Clone , Debug ) ]
60- pub struct HostFields ( pub HashMap < String , Vec < Vec < u8 > > > ) ;
61-
62- impl HostFields {
63- pub fn new ( ) -> Self {
64- Self ( FieldsMap :: new ( ) )
65- }
66- }
52+ #[ derive( Clone ) ]
53+ pub struct FieldMap ( pub HashMap < String , Vec < Vec < u8 > > > ) ;
6754
68- impl From < hyper:: HeaderMap > for HostFields {
55+ impl From < hyper:: HeaderMap > for FieldMap {
6956 fn from ( headers : hyper:: HeaderMap ) -> Self {
7057 use std:: collections:: hash_map:: Entry ;
7158
@@ -85,6 +72,21 @@ impl From<hyper::HeaderMap> for HostFields {
8572 }
8673}
8774
75+ pub enum HostFields {
76+ Ref {
77+ parent : u32 ,
78+
79+ // NOTE: there's not failure in the result here because we assume that HostFields will
80+ // always be registered as a child of the entry with the `parent` id. This ensures that the
81+ // entry will always exist while this `HostFields::Ref` entry exists in the table, thus we
82+ // don't need to account for failure when fetching the fields ref from the parent.
83+ get_fields : for <' a > fn ( elem : & ' a mut dyn Any ) -> & ' a mut FieldMap ,
84+ } ,
85+ Owned {
86+ fields : FieldMap ,
87+ } ,
88+ }
89+
8890pub struct IncomingResponseInternal {
8991 pub resp : hyper:: Response < hyper:: body:: Incoming > ,
9092 pub worker : AbortOnDropJoinHandle < anyhow:: Result < ( ) > > ,
@@ -153,8 +155,7 @@ pub trait TableHttpExt {
153155 fn delete_incoming_response ( & mut self , id : u32 ) -> Result < HostIncomingResponse , TableError > ;
154156
155157 fn push_fields ( & mut self , fields : HostFields ) -> Result < u32 , TableError > ;
156- fn get_fields ( & self , id : u32 ) -> Result < & HostFields , TableError > ;
157- fn get_fields_mut ( & mut self , id : u32 ) -> Result < & mut HostFields , TableError > ;
158+ fn get_fields ( & mut self , id : u32 ) -> Result < & mut FieldMap , TableError > ;
158159 fn delete_fields ( & mut self , id : u32 ) -> Result < HostFields , TableError > ;
159160
160161 fn push_future_incoming_response (
@@ -178,9 +179,18 @@ pub trait TableHttpExt {
178179 fn get_incoming_body ( & mut self , id : IncomingBody ) -> Result < & mut HostIncomingBody , TableError > ;
179180 fn delete_incoming_body ( & mut self , id : IncomingBody ) -> Result < HostIncomingBody , TableError > ;
180181
181- fn push_future_trailers ( & mut self , trailers : HostFutureTrailers ) -> Result < FutureTrailers , TableError > ;
182- fn get_future_trailers ( & mut self , id : FutureTrailers ) -> Result < & mut HostFutureTrailers , TableError > ;
183- fn delete_future_trailers ( & mut self , id : FutureTrailers ) -> Result < HostFutureTrailers , TableError > ;
182+ fn push_future_trailers (
183+ & mut self ,
184+ trailers : HostFutureTrailers ,
185+ ) -> Result < FutureTrailers , TableError > ;
186+ fn get_future_trailers (
187+ & mut self ,
188+ id : FutureTrailers ,
189+ ) -> Result < & mut HostFutureTrailers , TableError > ;
190+ fn delete_future_trailers (
191+ & mut self ,
192+ id : FutureTrailers ,
193+ ) -> Result < HostFutureTrailers , TableError > ;
184194}
185195
186196#[ async_trait:: async_trait]
@@ -223,13 +233,18 @@ impl TableHttpExt for Table {
223233 }
224234
225235 fn push_fields ( & mut self , fields : HostFields ) -> Result < u32 , TableError > {
226- self . push ( Box :: new ( fields) )
227- }
228- fn get_fields ( & self , id : u32 ) -> Result < & HostFields , TableError > {
229- self . get :: < HostFields > ( id )
236+ match fields {
237+ HostFields :: Ref { parent , .. } => self . push_child ( Box :: new ( fields ) , parent ) ,
238+ HostFields :: Owned { .. } => self . push ( Box :: new ( fields ) ) ,
239+ }
230240 }
231- fn get_fields_mut ( & mut self , id : u32 ) -> Result < & mut HostFields , TableError > {
232- self . get_mut :: < HostFields > ( id)
241+ fn get_fields < ' a > ( & ' a mut self , id : u32 ) -> Result < & ' a mut FieldMap , TableError > {
242+ let ( parent, get_fields) = match self . get_mut :: < HostFields > ( id) ? {
243+ HostFields :: Ref { parent, get_fields } => ( * parent, * get_fields) ,
244+ HostFields :: Owned { fields } => return Ok ( fields) ,
245+ } ;
246+ let mut entry: OccupiedEntry < ' a > = self . entry ( parent) . unwrap ( ) ;
247+ Ok ( get_fields ( entry. get_mut ( ) ) )
233248 }
234249 fn delete_fields ( & mut self , id : u32 ) -> Result < HostFields , TableError > {
235250 let fields = self . delete :: < HostFields > ( id) ?;
@@ -273,15 +288,24 @@ impl TableHttpExt for Table {
273288 self . delete ( id)
274289 }
275290
276- fn push_future_trailers ( & mut self , trailers : HostFutureTrailers ) -> Result < FutureTrailers , TableError > {
291+ fn push_future_trailers (
292+ & mut self ,
293+ trailers : HostFutureTrailers ,
294+ ) -> Result < FutureTrailers , TableError > {
277295 self . push ( Box :: new ( trailers) )
278296 }
279297
280- fn get_future_trailers ( & mut self , id : FutureTrailers ) -> Result < & mut HostFutureTrailers , TableError > {
298+ fn get_future_trailers (
299+ & mut self ,
300+ id : FutureTrailers ,
301+ ) -> Result < & mut HostFutureTrailers , TableError > {
281302 self . get_mut ( id)
282303 }
283304
284- fn delete_future_trailers ( & mut self , id : FutureTrailers ) -> Result < HostFutureTrailers , TableError > {
305+ fn delete_future_trailers (
306+ & mut self ,
307+ id : FutureTrailers ,
308+ ) -> Result < HostFutureTrailers , TableError > {
285309 self . delete ( id)
286310 }
287311}
0 commit comments