//! Example for using h2 directly.
//! Example code is modified from https://github.com/hyperium/h2/blob/master/examples/client.rs.

use monoio::{io::IntoPollIo, net::TcpStream};

#[monoio::main]
async fn main() {
    let io = TcpStream::connect("127.0.0.1:5928")
        .await
        .unwrap()
        .into_poll_io()
        .unwrap();
    let (mut client, h2) = h2::client::handshake(io).await.unwrap();

    println!("sending request");

    let request = http::Request::builder()
        .uri("https://http2.akamai.com/")
        .body(())
        .unwrap();

    let mut trailers = http::HeaderMap::new();
    trailers.insert("zomg", "hello".parse().unwrap());

    let (response, mut stream) = client.send_request(request, false).unwrap();

    // send trailers
    stream.send_trailers(trailers).unwrap();

    // Spawn a task to run the conn...
    monoio::spawn(async move {
        if let Err(e) = h2.await {
            println!("GOT ERR={e:?}");
        }
    });

    let response = response.await.unwrap();
    println!("GOT RESPONSE: {response:?}");

    // Get the body
    let mut body = response.into_body();

    while let Some(chunk) = body.data().await {
        println!("GOT CHUNK = {:?}", chunk.unwrap());
    }

    if let Some(trailers) = body.trailers().await.unwrap() {
        println!("GOT TRAILERS: {trailers:?}");
    }
}
