1*b315a0a8SYosh use test_programs::wasi::http::types as http_types;
2*b315a0a8SYosh 
make_request() -> http_types::OutgoingRequest3*b315a0a8SYosh fn make_request() -> http_types::OutgoingRequest {
4*b315a0a8SYosh     let request = http_types::OutgoingRequest::new(
5*b315a0a8SYosh         http_types::Headers::from_list(&[("Content-Length".to_string(), b"11".to_vec())]).unwrap(),
6*b315a0a8SYosh     );
7*b315a0a8SYosh 
8*b315a0a8SYosh     request
9*b315a0a8SYosh         .set_method(&http_types::Method::Post)
10*b315a0a8SYosh         .expect("setting method");
11*b315a0a8SYosh     request
12*b315a0a8SYosh         .set_scheme(Some(&http_types::Scheme::Http))
13*b315a0a8SYosh         .expect("setting scheme");
14*b315a0a8SYosh     let addr = std::env::var("HTTP_SERVER").unwrap();
15*b315a0a8SYosh     request
16*b315a0a8SYosh         .set_authority(Some(&addr))
17*b315a0a8SYosh         .expect("setting authority");
18*b315a0a8SYosh     request
19*b315a0a8SYosh         .set_path_with_query(Some("/"))
20*b315a0a8SYosh         .expect("setting path with query");
21*b315a0a8SYosh 
22*b315a0a8SYosh     request
23*b315a0a8SYosh }
24*b315a0a8SYosh 
main()25*b315a0a8SYosh fn main() {
26*b315a0a8SYosh     {
27*b315a0a8SYosh         println!("writing enough");
28*b315a0a8SYosh         let request = make_request();
29*b315a0a8SYosh         let outgoing_body = request.body().unwrap();
30*b315a0a8SYosh 
31*b315a0a8SYosh         {
32*b315a0a8SYosh             let request_body = outgoing_body.write().unwrap();
33*b315a0a8SYosh             request_body
34*b315a0a8SYosh                 .blocking_write_and_flush("long enough".as_bytes())
35*b315a0a8SYosh                 .unwrap();
36*b315a0a8SYosh         }
37*b315a0a8SYosh 
38*b315a0a8SYosh         http_types::OutgoingBody::finish(outgoing_body, None).expect("enough written")
39*b315a0a8SYosh     }
40*b315a0a8SYosh 
41*b315a0a8SYosh     {
42*b315a0a8SYosh         println!("writing too little");
43*b315a0a8SYosh         let request = make_request();
44*b315a0a8SYosh         let outgoing_body = request.body().unwrap();
45*b315a0a8SYosh 
46*b315a0a8SYosh         {
47*b315a0a8SYosh             let request_body = outgoing_body.write().unwrap();
48*b315a0a8SYosh             request_body
49*b315a0a8SYosh                 .blocking_write_and_flush("msg".as_bytes())
50*b315a0a8SYosh                 .unwrap();
51*b315a0a8SYosh         }
52*b315a0a8SYosh 
53*b315a0a8SYosh         let e =
54*b315a0a8SYosh             http_types::OutgoingBody::finish(outgoing_body, None).expect_err("finish should fail");
55*b315a0a8SYosh 
56*b315a0a8SYosh         assert!(
57*b315a0a8SYosh             matches!(&e, http_types::ErrorCode::HttpRequestBodySize(Some(3))),
58*b315a0a8SYosh             "unexpected error: {e:#?}"
59*b315a0a8SYosh         );
60*b315a0a8SYosh     }
61*b315a0a8SYosh 
62*b315a0a8SYosh     {
63*b315a0a8SYosh         println!("writing too much");
64*b315a0a8SYosh         let request = make_request();
65*b315a0a8SYosh         let outgoing_body = request.body().unwrap();
66*b315a0a8SYosh 
67*b315a0a8SYosh         {
68*b315a0a8SYosh             let request_body = outgoing_body.write().unwrap();
69*b315a0a8SYosh             let e = request_body
70*b315a0a8SYosh                 .blocking_write_and_flush("more than 11 bytes".as_bytes())
71*b315a0a8SYosh                 .expect_err("write should fail");
72*b315a0a8SYosh 
73*b315a0a8SYosh             let e = match e {
74*b315a0a8SYosh                 test_programs::wasi::io::streams::StreamError::LastOperationFailed(e) => {
75*b315a0a8SYosh                     http_types::http_error_code(&e)
76*b315a0a8SYosh                 }
77*b315a0a8SYosh                 test_programs::wasi::io::streams::StreamError::Closed => panic!("request closed"),
78*b315a0a8SYosh             };
79*b315a0a8SYosh 
80*b315a0a8SYosh             assert!(
81*b315a0a8SYosh                 matches!(
82*b315a0a8SYosh                     e,
83*b315a0a8SYosh                     Some(http_types::ErrorCode::HttpRequestBodySize(Some(18)))
84*b315a0a8SYosh                 ),
85*b315a0a8SYosh                 "unexpected error {e:?}"
86*b315a0a8SYosh             );
87*b315a0a8SYosh         }
88*b315a0a8SYosh 
89*b315a0a8SYosh         let e =
90*b315a0a8SYosh             http_types::OutgoingBody::finish(outgoing_body, None).expect_err("finish should fail");
91*b315a0a8SYosh 
92*b315a0a8SYosh         assert!(
93*b315a0a8SYosh             matches!(&e, http_types::ErrorCode::HttpRequestBodySize(Some(18))),
94*b315a0a8SYosh             "unexpected error: {e:#?}"
95*b315a0a8SYosh         );
96*b315a0a8SYosh     }
97*b315a0a8SYosh }
98