server.rs 1.9 KB

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