http/
http.rs

1use std::{net::TcpStream, time::SystemTime};
2
3use microasync::{join, sync};
4use microasync_util::{
5    io::{ReadAsync, WriteAsync},
6    wait_ms,
7};
8
9fn main() {
10    // Connecting cannot be done async (for now), so we won't include that in the timing.
11    let tcp = TcpStream::connect(("google.com", 80)).expect("connection refused");
12    let start = SystemTime::now();
13    println!(
14        "{}",
15        sync(join!(request("google.com", tcp, "GET /"), async {
16            wait_ms(1000).await;
17            "".to_owned()
18        }))[0]
19    );
20    println!("Took {}ms.", start.elapsed().unwrap().as_millis());
21}
22
23async fn request(host: &str, mut tcp: TcpStream, method: &str) -> String {
24    tcp.write(
25        (method.to_owned() + " HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n")
26            .as_bytes(),
27    )
28    .await
29    .expect("connection broke");
30    let mut buf = [0_u8; 64];
31    let mut r = String::new();
32    loop {
33        let n = tcp.read(&mut buf).await.expect("connection broke");
34        if n == 0 {
35            break;
36        }
37        r += buf[0..n]
38            .iter()
39            .map(|x| *x as char)
40            .collect::<String>()
41            .as_str();
42    }
43    r
44}