1 use std::error::Error;
2
3 use bytes::Bytes;
4 use h2::server::{self, SendResponse};
5 use h2::RecvStream;
6 use http::Request;
7 use tokio::net::{TcpListener, TcpStream};
8
9 #[tokio::main]
main() -> Result<(), Box<dyn Error + Send + Sync>>10 async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
11 let _ = env_logger::try_init();
12
13 let listener = TcpListener::bind("127.0.0.1:5928").await?;
14
15 println!("listening on {:?}", listener.local_addr());
16
17 loop {
18 if let Ok((socket, _peer_addr)) = listener.accept().await {
19 tokio::spawn(async move {
20 if let Err(e) = serve(socket).await {
21 println!(" -> err={:?}", e);
22 }
23 });
24 }
25 }
26 }
27
serve(socket: TcpStream) -> Result<(), Box<dyn Error + Send + Sync>>28 async fn serve(socket: TcpStream) -> Result<(), Box<dyn Error + Send + Sync>> {
29 let mut connection = server::handshake(socket).await?;
30 println!("H2 connection bound");
31
32 while let Some(result) = connection.accept().await {
33 let (request, respond) = result?;
34 tokio::spawn(async move {
35 if let Err(e) = handle_request(request, respond).await {
36 println!("error while handling request: {}", e);
37 }
38 });
39 }
40
41 println!("~~~~~~~~~~~ H2 connection CLOSE !!!!!! ~~~~~~~~~~~");
42 Ok(())
43 }
44
handle_request( mut request: Request<RecvStream>, mut respond: SendResponse<Bytes>, ) -> Result<(), Box<dyn Error + Send + Sync>>45 async fn handle_request(
46 mut request: Request<RecvStream>,
47 mut respond: SendResponse<Bytes>,
48 ) -> Result<(), Box<dyn Error + Send + Sync>> {
49 println!("GOT request: {:?}", request);
50
51 let body = request.body_mut();
52 while let Some(data) = body.data().await {
53 let data = data?;
54 println!("<<<< recv {:?}", data);
55 let _ = body.flow_control().release_capacity(data.len());
56 }
57
58 let response = http::Response::new(());
59 let mut send = respond.send_response(response, false)?;
60 println!(">>>> send");
61 send.send_data(Bytes::from_static(b"hello "), false)?;
62 send.send_data(Bytes::from_static(b"world\n"), true)?;
63
64 Ok(())
65 }
66