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