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 {
handle(request: Request) -> Result<Response, ErrorCode>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`
main()59 fn main() {}
60
61 // TODO: adapt below
62 //fn test_filesystem() {
63 // assert!(std::fs::File::open(".").is_err());
64 //}
65