]> git.proxmox.com Git - proxmox-backup.git/blob - src/bin/h2server.rs
introduce new runtime tokio helpers
[proxmox-backup.git] / src / bin / h2server.rs
1 use failure::*;
2 use futures::*;
3
4 // Simple H2 server to test H2 speed with h2client.rs
5
6 use tokio::net::TcpListener;
7 use tokio::io::{AsyncRead, AsyncWrite};
8
9 use proxmox_backup::client::pipe_to_stream::PipeToSendStream;
10
11 fn main() -> Result<(), Error> {
12 proxmox_backup::tools::runtime::main(run())
13 }
14
15 async fn run() -> Result<(), Error> {
16 let mut listener = TcpListener::bind(std::net::SocketAddr::from(([127,0,0,1], 8008))).await?;
17
18 println!("listening on {:?}", listener.local_addr());
19
20 loop {
21 let (socket, _addr) = listener.accept().await?;
22 tokio::spawn(handle_connection(socket)
23 .map(|res| {
24 if let Err(err) = res {
25 eprintln!("Error: {}", err);
26 }
27 }));
28 }
29 }
30
31 async fn handle_connection<T: AsyncRead + AsyncWrite + Unpin>(socket: T) -> Result<(), Error> {
32 let mut conn = h2::server::handshake(socket).await?;
33
34 println!("H2 connection bound");
35
36 while let Some((request, mut respond)) = conn.try_next().await? {
37 println!("GOT request: {:?}", request);
38
39 let response = http::Response::builder()
40 .status(http::StatusCode::OK)
41 .body(())
42 .unwrap();
43
44 let send = respond.send_response(response, false).unwrap();
45 let data = vec![65u8; 1024*1024];
46 PipeToSendStream::new(bytes::Bytes::from(data), send).await?;
47 println!("DATA SENT");
48 }
49
50 Ok(())
51 }