1*6f6a514bSRoman Volosatovs use anyhow::Context;
2*6f6a514bSRoman Volosatovs use std::io::{self, Read};
3*6f6a514bSRoman Volosatovs use test_programs::p3::wasi::http::types::{Method, Scheme};
4*6f6a514bSRoman Volosatovs 
5*6f6a514bSRoman Volosatovs struct Component;
6*6f6a514bSRoman Volosatovs 
7*6f6a514bSRoman Volosatovs test_programs::p3::export!(Component);
8*6f6a514bSRoman Volosatovs 
9*6f6a514bSRoman Volosatovs impl test_programs::p3::exports::wasi::cli::run::Guest for Component {
run() -> Result<(), ()>10*6f6a514bSRoman Volosatovs     async fn run() -> Result<(), ()> {
11*6f6a514bSRoman Volosatovs         // Make sure the final body is larger than 1024*1024, but we cannot allocate
12*6f6a514bSRoman Volosatovs         // so much memory directly in the wasm program, so we use the `repeat`
13*6f6a514bSRoman Volosatovs         // method to increase the body size.
14*6f6a514bSRoman Volosatovs         const LEN: usize = 1024;
15*6f6a514bSRoman Volosatovs         const REPEAT: usize = 1025;
16*6f6a514bSRoman Volosatovs         let mut buffer = [0; LEN];
17*6f6a514bSRoman Volosatovs         let addr = test_programs::p3::wasi::cli::environment::get_environment()
18*6f6a514bSRoman Volosatovs             .into_iter()
19*6f6a514bSRoman Volosatovs             .find_map(|(k, v)| k.eq("HTTP_SERVER").then_some(v))
20*6f6a514bSRoman Volosatovs             .unwrap();
21*6f6a514bSRoman Volosatovs         io::repeat(0b001).read_exact(&mut buffer).unwrap();
22*6f6a514bSRoman Volosatovs         let res = test_programs::p3::http::request(
23*6f6a514bSRoman Volosatovs             Method::Post,
24*6f6a514bSRoman Volosatovs             Scheme::Http,
25*6f6a514bSRoman Volosatovs             &addr,
26*6f6a514bSRoman Volosatovs             "/post",
27*6f6a514bSRoman Volosatovs             Some(&buffer.repeat(REPEAT)),
28*6f6a514bSRoman Volosatovs             None,
29*6f6a514bSRoman Volosatovs             None,
30*6f6a514bSRoman Volosatovs             None,
31*6f6a514bSRoman Volosatovs             None,
32*6f6a514bSRoman Volosatovs         )
33*6f6a514bSRoman Volosatovs         .await
34*6f6a514bSRoman Volosatovs         .context("/post large")
35*6f6a514bSRoman Volosatovs         .unwrap();
36*6f6a514bSRoman Volosatovs 
37*6f6a514bSRoman Volosatovs         println!("/post large: {}", res.status);
38*6f6a514bSRoman Volosatovs         assert_eq!(res.status, 200);
39*6f6a514bSRoman Volosatovs         let method = res.header("x-wasmtime-test-method").unwrap();
40*6f6a514bSRoman Volosatovs         assert_eq!(std::str::from_utf8(method).unwrap(), "POST");
41*6f6a514bSRoman Volosatovs         assert_eq!(res.body.len(), LEN * REPEAT);
42*6f6a514bSRoman Volosatovs         Ok(())
43*6f6a514bSRoman Volosatovs     }
44*6f6a514bSRoman Volosatovs }
45*6f6a514bSRoman Volosatovs 
main()46*6f6a514bSRoman Volosatovs fn main() {}
47