1 use anyhow::Context;
2 use std::net::SocketAddr;
3 use std::time::Duration;
4 use test_programs::p3::wasi::http::types::{ErrorCode, Method, Scheme};
5 
6 struct Component;
7 
8 test_programs::p3::export!(Component);
9 
10 impl test_programs::p3::exports::wasi::cli::run::Guest for Component {
11     async fn run() -> Result<(), ()> {
12         // This address inside the TEST-NET-3 address block is expected to time out.
13         let addr = SocketAddr::from(([203, 0, 113, 12], 80)).to_string();
14         let timeout = Duration::from_millis(200);
15         let connect_timeout: Option<u64> = Some(timeout.as_nanos() as u64);
16         let res = test_programs::p3::http::request(
17             Method::Get,
18             Scheme::Http,
19             &addr,
20             "/get?some=arg&goes=here",
21             None,
22             None,
23             connect_timeout,
24             None,
25             None,
26         )
27         .await
28         .context("/get");
29 
30         assert!(res.is_err());
31         let err = res.unwrap_err();
32         assert!(
33             matches!(
34                 err.downcast_ref::<ErrorCode>(),
35                 Some(ErrorCode::ConnectionTimeout | ErrorCode::ConnectionRefused)
36             ),
37             "expected connection timeout: {err:?}"
38         );
39         Ok(())
40     }
41 }
42 
43 fn main() {}
44