16f6a514bSRoman Volosatovs use test_programs::p3::wasi::http::types::{Fields, Headers, Method, Request, Response, Scheme};
26f6a514bSRoman Volosatovs use test_programs::p3::{wit_future, wit_stream};
36f6a514bSRoman Volosatovs 
46f6a514bSRoman Volosatovs struct Component;
56f6a514bSRoman Volosatovs 
66f6a514bSRoman Volosatovs test_programs::p3::export!(Component);
76f6a514bSRoman Volosatovs 
86f6a514bSRoman Volosatovs impl test_programs::p3::exports::wasi::cli::run::Guest for Component {
run() -> Result<(), ()>96f6a514bSRoman Volosatovs     async fn run() -> Result<(), ()> {
106f6a514bSRoman Volosatovs         println!("Called _start");
116f6a514bSRoman Volosatovs         {
126f6a514bSRoman Volosatovs             let headers = Headers::from_list(&[(
136f6a514bSRoman Volosatovs                 "Content-Type".to_string(),
146f6a514bSRoman Volosatovs                 "application/json".to_string().into_bytes(),
156f6a514bSRoman Volosatovs             )])
166f6a514bSRoman Volosatovs             .unwrap();
176f6a514bSRoman Volosatovs             let (mut contents_tx, contents_rx) = wit_stream::new();
186f6a514bSRoman Volosatovs             let (_, trailers_rx) = wit_future::new(|| Ok(None));
196f6a514bSRoman Volosatovs             let (request, _) = Request::new(headers, Some(contents_rx), trailers_rx, None);
206f6a514bSRoman Volosatovs 
216f6a514bSRoman Volosatovs             request.set_method(&Method::Get).expect("setting method");
226f6a514bSRoman Volosatovs             request
236f6a514bSRoman Volosatovs                 .set_scheme(Some(&Scheme::Https))
246f6a514bSRoman Volosatovs                 .expect("setting scheme");
256f6a514bSRoman Volosatovs             request
266f6a514bSRoman Volosatovs                 .set_authority(Some("www.example.com"))
276f6a514bSRoman Volosatovs                 .expect("setting authority");
286f6a514bSRoman Volosatovs             drop(request);
29*f3d72564SRoman Volosatovs             let remaining = contents_tx.write_all(b"request-body".to_vec()).await;
30*f3d72564SRoman Volosatovs             assert_eq!(String::from_utf8_lossy(&remaining), "request-body");
316f6a514bSRoman Volosatovs         }
326f6a514bSRoman Volosatovs         {
336f6a514bSRoman Volosatovs             let headers = Headers::from_list(&[(
346f6a514bSRoman Volosatovs                 "Content-Type".to_string(),
356f6a514bSRoman Volosatovs                 "application/text".to_string().into_bytes(),
366f6a514bSRoman Volosatovs             )])
376f6a514bSRoman Volosatovs             .unwrap();
386f6a514bSRoman Volosatovs             let (mut contents_tx, contents_rx) = wit_stream::new();
396f6a514bSRoman Volosatovs             let (_, trailers_rx) = wit_future::new(|| Ok(None));
406f6a514bSRoman Volosatovs             let _ = Response::new(headers, Some(contents_rx), trailers_rx);
416f6a514bSRoman Volosatovs             let remaining = contents_tx.write_all(b"response-body".to_vec()).await;
426f6a514bSRoman Volosatovs             assert!(!remaining.is_empty());
436f6a514bSRoman Volosatovs         }
446f6a514bSRoman Volosatovs 
456f6a514bSRoman Volosatovs         {
466f6a514bSRoman Volosatovs             let (_, trailers_rx) = wit_future::new(|| Ok(None));
476f6a514bSRoman Volosatovs             let (req, _) = Request::new(Fields::new(), None, trailers_rx, None);
486f6a514bSRoman Volosatovs 
496f6a514bSRoman Volosatovs             assert!(
506f6a514bSRoman Volosatovs                 req.set_method(&Method::Other("invalid method".to_string()))
516f6a514bSRoman Volosatovs                     .is_err()
526f6a514bSRoman Volosatovs             );
536f6a514bSRoman Volosatovs 
546f6a514bSRoman Volosatovs             assert!(req.set_authority(Some("bad-port:99999")).is_err());
556f6a514bSRoman Volosatovs             assert!(req.set_authority(Some("bad-\nhost")).is_err());
566f6a514bSRoman Volosatovs             assert!(req.set_authority(Some("too-many-ports:80:80:80")).is_err());
576f6a514bSRoman Volosatovs 
586f6a514bSRoman Volosatovs             assert!(
596f6a514bSRoman Volosatovs                 req.set_scheme(Some(&Scheme::Other("bad\nscheme".to_string())))
606f6a514bSRoman Volosatovs                     .is_err()
616f6a514bSRoman Volosatovs             );
626f6a514bSRoman Volosatovs 
636f6a514bSRoman Volosatovs             assert!(req.set_path_with_query(Some("/bad\npath")).is_err());
646f6a514bSRoman Volosatovs         }
656f6a514bSRoman Volosatovs 
666f6a514bSRoman Volosatovs         println!("Done");
676f6a514bSRoman Volosatovs         Ok(())
686f6a514bSRoman Volosatovs     }
696f6a514bSRoman Volosatovs }
706f6a514bSRoman Volosatovs 
main()716f6a514bSRoman Volosatovs fn main() {}
72