4 // Simple H2 server to test H2 speed with h2s-client.rs
6 use hyper
::{Request, Response, Body}
;
7 use tokio
::net
::TcpListener
;
9 use proxmox_backup
::configdir
;
11 use openssl
::ssl
::{SslMethod, SslAcceptor, SslFiletype}
;
13 use tokio_openssl
::SslAcceptorExt
;
15 pub fn main() -> Result
<(), Error
> {
22 pub fn start_h2_server() -> Result
<(), Error
> {
24 let key_path
= configdir
!("/proxy.key");
25 let cert_path
= configdir
!("/proxy.pem");
27 let mut acceptor
= SslAcceptor
::mozilla_intermediate(SslMethod
::tls()).unwrap();
28 acceptor
.set_private_key_file(key_path
, SslFiletype
::PEM
)
29 .map_err(|err
| format_err
!("unable to read proxy key {} - {}", key_path
, err
))?
;
30 acceptor
.set_certificate_chain_file(cert_path
)
31 .map_err(|err
| format_err
!("unable to read proxy cert {} - {}", cert_path
, err
))?
;
32 acceptor
.check_private_key().unwrap();
34 let acceptor
= Arc
::new(acceptor
.build());
36 let listener
= TcpListener
::bind(&"127.0.0.1:8008".parse().unwrap()).unwrap();
38 println
!("listening on {:?}", listener
.local_addr());
43 .and_then(move |sock
| {
44 sock
.set_nodelay(true).unwrap();
45 sock
.set_send_buffer_size(1024*1024).unwrap();
46 sock
.set_recv_buffer_size(1024*1024).unwrap();
47 acceptor
.accept_async(sock
).map_err(|e
| e
.into())
50 // accept()s can fail here with an Err() when eg. the client rejects
51 // the cert and closes the connection, so we follow up with mapping
52 // it to an option and then filtering None with filter_map
53 Ok(c
) => Ok
::<_
, Error
>(Some(c
)),
55 if let Some(_io
) = e
.downcast_ref
::<std
::io
::Error
>() {
56 // "real" IO errors should not simply be ignored
57 bail
!("shutting down...");
59 // handshake errors just get filtered by filter_map() below:
65 // Filter out the Nones
68 .for_each(move |socket
| {
70 let mut http
= hyper
::server
::conn
::Http
::new();
71 http
.http2_only(true);
72 // increase window size: todo - find optiomal size
73 let max_window_size
= (1 << 31) - 2;
74 http
.http2_initial_stream_window_size(max_window_size
);
75 http
.http2_initial_connection_window_size(max_window_size
);
77 let service
= hyper
::service
::service_fn(|_req
: Request
<Body
>| {
78 println
!("Got request");
79 let buffer
= vec
![65u8; 1024*1024]; // nonsense [A,A,A,A...]
80 let body
= Body
::from(buffer
);
82 let response
= Response
::builder()
83 .status(http
::StatusCode
::OK
)
84 .header(http
::header
::CONTENT_TYPE
, "application/octet-stream")
87 Ok
::<_
, Error
>(response
)
89 http
.serve_connection(socket
, service
)
93 println
!("H2 connection CLOSE !");
98 println
!(" -> err={:?}", e
);