1 use test_programs::p3::wasi::http::types::{Fields, Headers, Method, Request, Response, Scheme};
2 use test_programs::p3::{wit_future, wit_stream};
3 
4 struct Component;
5 
6 test_programs::p3::export!(Component);
7 
8 impl test_programs::p3::exports::wasi::cli::run::Guest for Component {
9     async fn run() -> Result<(), ()> {
10         println!("Called _start");
11         {
12             let headers = Headers::from_list(&[(
13                 "Content-Type".to_string(),
14                 "application/json".to_string().into_bytes(),
15             )])
16             .unwrap();
17             let (mut contents_tx, contents_rx) = wit_stream::new();
18             let (_, trailers_rx) = wit_future::new(|| Ok(None));
19             let (request, _) = Request::new(headers, Some(contents_rx), trailers_rx, None);
20 
21             request.set_method(&Method::Get).expect("setting method");
22             request
23                 .set_scheme(Some(&Scheme::Https))
24                 .expect("setting scheme");
25             request
26                 .set_authority(Some("www.example.com"))
27                 .expect("setting authority");
28             let (remaining, ()) =
29                 futures::join!(contents_tx.write_all(b"request-body".to_vec()), async {
30                     drop(request);
31                 },);
32             assert!(!remaining.is_empty());
33         }
34         {
35             let headers = Headers::from_list(&[(
36                 "Content-Type".to_string(),
37                 "application/text".to_string().into_bytes(),
38             )])
39             .unwrap();
40             let (mut contents_tx, contents_rx) = wit_stream::new();
41             let (_, trailers_rx) = wit_future::new(|| Ok(None));
42             let _ = Response::new(headers, Some(contents_rx), trailers_rx);
43             let remaining = contents_tx.write_all(b"response-body".to_vec()).await;
44             assert!(!remaining.is_empty());
45         }
46 
47         {
48             let (_, trailers_rx) = wit_future::new(|| Ok(None));
49             let (req, _) = Request::new(Fields::new(), None, trailers_rx, None);
50 
51             assert!(
52                 req.set_method(&Method::Other("invalid method".to_string()))
53                     .is_err()
54             );
55 
56             assert!(req.set_authority(Some("bad-port:99999")).is_err());
57             assert!(req.set_authority(Some("bad-\nhost")).is_err());
58             assert!(req.set_authority(Some("too-many-ports:80:80:80")).is_err());
59 
60             assert!(
61                 req.set_scheme(Some(&Scheme::Other("bad\nscheme".to_string())))
62                     .is_err()
63             );
64 
65             assert!(req.set_path_with_query(Some("/bad\npath")).is_err());
66         }
67 
68         println!("Done");
69         Ok(())
70     }
71 }
72 
73 fn main() {}
74