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