5 use hyper
::{Request, Response, Body}
;
6 use openssl
::ssl
::{SslMethod, SslAcceptor, SslFiletype}
;
7 use tokio
::net
::{TcpListener, TcpStream}
;
9 use proxmox_backup
::configdir
;
11 // Simple H2 server to test H2 speed with h2s-client.rs
14 async
fn main() -> Result
<(), Error
> {
15 let key_path
= configdir
!("/proxy.key");
16 let cert_path
= configdir
!("/proxy.pem");
18 let mut acceptor
= SslAcceptor
::mozilla_intermediate(SslMethod
::tls()).unwrap();
19 acceptor
.set_private_key_file(key_path
, SslFiletype
::PEM
)
20 .map_err(|err
| format_err
!("unable to read proxy key {} - {}", key_path
, err
))?
;
21 acceptor
.set_certificate_chain_file(cert_path
)
22 .map_err(|err
| format_err
!("unable to read proxy cert {} - {}", cert_path
, err
))?
;
23 acceptor
.check_private_key().unwrap();
25 let acceptor
= Arc
::new(acceptor
.build());
27 let mut listener
= TcpListener
::bind(std
::net
::SocketAddr
::from(([127,0,0,1], 8008))).await?
;
29 println
!("listening on {:?}", listener
.local_addr());
32 let (socket
, _addr
) = listener
.accept().await?
;
33 tokio
::spawn(handle_connection(socket
, Arc
::clone(&acceptor
))
35 if let Err(err
) = res
{
36 eprintln
!("Error: {}", err
);
42 async
fn handle_connection(
44 acceptor
: Arc
<SslAcceptor
>,
45 ) -> Result
<(), Error
> {
46 socket
.set_nodelay(true).unwrap();
47 socket
.set_send_buffer_size(1024*1024).unwrap();
48 socket
.set_recv_buffer_size(1024*1024).unwrap();
50 let socket
= tokio_openssl
::accept(acceptor
.as_ref(), socket
).await?
;
52 let mut http
= hyper
::server
::conn
::Http
::new();
53 http
.http2_only(true);
54 // increase window size: todo - find optiomal size
55 let max_window_size
= (1 << 31) - 2;
56 http
.http2_initial_stream_window_size(max_window_size
);
57 http
.http2_initial_connection_window_size(max_window_size
);
59 let service
= hyper
::service
::service_fn(|_req
: Request
<Body
>| {
60 println
!("Got request");
61 let buffer
= vec
![65u8; 1024*1024]; // nonsense [A,A,A,A...]
62 let body
= Body
::from(buffer
);
64 let response
= Response
::builder()
65 .status(http
::StatusCode
::OK
)
66 .header(http
::header
::CONTENT_TYPE
, "application/octet-stream")
69 future
::ok
::<_
, Error
>(response
)
72 http
.serve_connection(socket
, service
)
76 println
!("H2 connection CLOSE !");