• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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