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