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