1 use test_programs::wasi::http::types as http_types; 2 3 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 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