1 use futures::join; 2 use test_programs::p3::wasi::http::types::{ErrorCode, Headers, Request, Response}; 3 use test_programs::p3::{wit_future, wit_stream}; 4 use wit_bindgen::spawn; 5 6 struct T; 7 8 test_programs::p3::service::export!(T); 9 10 impl test_programs::p3::service::exports::wasi::http::handler::Guest for T { 11 async fn handle(request: Request) -> Result<Response, ErrorCode> { 12 assert!(request.get_scheme().is_some()); 13 assert!(request.get_authority().is_some()); 14 assert!(request.get_path_with_query().is_some()); 15 16 // TODO: adapt below 17 //test_filesystem(); 18 19 let header = String::from("custom-forbidden-header"); 20 let req_hdrs = request.get_headers(); 21 22 assert!( 23 !req_hdrs.has(&header), 24 "forbidden `custom-forbidden-header` found in request" 25 ); 26 27 assert!(req_hdrs.delete(&header).is_err()); 28 assert!(req_hdrs.append(&header, b"no".as_ref()).is_err()); 29 30 assert!( 31 !req_hdrs.has(&header), 32 "append of forbidden header succeeded" 33 ); 34 35 let hdrs = Headers::new(); 36 let (mut contents_tx, contents_rx) = wit_stream::new(); 37 let (trailers_tx, trailers_rx) = wit_future::new(|| todo!()); 38 let (resp, transmit) = Response::new(hdrs, Some(contents_rx), trailers_rx); 39 spawn(async { 40 join!( 41 async { 42 let remaining = contents_tx.write_all(b"hello, world!".to_vec()).await; 43 assert!(remaining.is_empty()); 44 drop(contents_tx); 45 trailers_tx 46 .write(Ok(None)) 47 .await 48 .expect("failed to write trailers"); 49 }, 50 async { transmit.await.unwrap() } 51 ); 52 }); 53 Ok(resp) 54 } 55 } 56 57 // Technically this should not be here for a service, but given the current 58 // framework for tests it's required since this file is built as a `bin` 59 fn main() {} 60 61 // TODO: adapt below 62 //fn test_filesystem() { 63 // assert!(std::fs::File::open(".").is_err()); 64 //} 65