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