]>
Commit | Line | Data |
---|---|---|
e235c8f7 WB |
1 | use std::sync::Arc; |
2 | ||
5ed2277f DM |
3 | use failure::*; |
4 | use futures::*; | |
5ed2277f | 5 | use hyper::{Request, Response, Body}; |
6d1f61b2 | 6 | use openssl::ssl::{SslMethod, SslAcceptor, SslFiletype}; |
e235c8f7 | 7 | use tokio::net::{TcpListener, TcpStream}; |
5ed2277f | 8 | |
e235c8f7 | 9 | use proxmox_backup::configdir; |
5ed2277f | 10 | |
e235c8f7 | 11 | // Simple H2 server to test H2 speed with h2s-client.rs |
5ed2277f | 12 | |
e235c8f7 WB |
13 | #[tokio::main] |
14 | async fn main() -> Result<(), Error> { | |
6d1f61b2 DM |
15 | let key_path = configdir!("/proxy.key"); |
16 | let cert_path = configdir!("/proxy.pem"); | |
5ed2277f | 17 | |
6d1f61b2 DM |
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(); | |
5ed2277f | 24 | |
6d1f61b2 | 25 | let acceptor = Arc::new(acceptor.build()); |
5ed2277f | 26 | |
083ff3fd | 27 | let listener = TcpListener::bind(std::net::SocketAddr::from(([127,0,0,1], 8008))).await?; |
5ed2277f DM |
28 | |
29 | println!("listening on {:?}", listener.local_addr()); | |
30 | ||
e235c8f7 WB |
31 | let mut incoming = listener.incoming(); |
32 | while let Some(socket) = incoming.try_next().await? { | |
33 | tokio::spawn(handle_connection(socket, Arc::clone(&acceptor)) | |
34 | .map(|res| { | |
35 | if let Err(err) = res { | |
36 | eprintln!("Error: {}", err); | |
5ed2277f | 37 | } |
e235c8f7 WB |
38 | })); |
39 | } | |
40 | ||
41 | Ok(()) | |
42 | } | |
43 | ||
44 | async fn handle_connection( | |
45 | socket: TcpStream, | |
46 | acceptor: Arc<SslAcceptor>, | |
47 | ) -> Result<(), Error> { | |
48 | socket.set_nodelay(true).unwrap(); | |
49 | socket.set_send_buffer_size(1024*1024).unwrap(); | |
50 | socket.set_recv_buffer_size(1024*1024).unwrap(); | |
51 | ||
52 | let socket = tokio_openssl::accept(acceptor.as_ref(), socket).await?; | |
53 | ||
54 | let mut http = hyper::server::conn::Http::new(); | |
55 | http.http2_only(true); | |
56 | // increase window size: todo - find optiomal size | |
57 | let max_window_size = (1 << 31) - 2; | |
58 | http.http2_initial_stream_window_size(max_window_size); | |
59 | http.http2_initial_connection_window_size(max_window_size); | |
60 | ||
61 | let service = hyper::service::service_fn(|_req: Request<Body>| { | |
62 | println!("Got request"); | |
63 | let buffer = vec![65u8; 1024*1024]; // nonsense [A,A,A,A...] | |
64 | let body = Body::from(buffer); | |
65 | ||
66 | let response = Response::builder() | |
67 | .status(http::StatusCode::OK) | |
68 | .header(http::header::CONTENT_TYPE, "application/octet-stream") | |
69 | .body(body) | |
70 | .unwrap(); | |
71 | future::ok::<_, Error>(response) | |
72 | }); | |
73 | ||
74 | http.serve_connection(socket, service) | |
75 | .map_err(Error::from) | |
76 | .await?; | |
5ed2277f | 77 | |
e235c8f7 | 78 | println!("H2 connection CLOSE !"); |
5ed2277f DM |
79 | Ok(()) |
80 | } |