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