diff options
author | metamuffin <metamuffin@disroot.org> | 2024-08-19 12:22:53 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-08-19 12:22:53 +0200 |
commit | 36a09fd6e452d2e6391a823a08787b5b17af7d08 (patch) | |
tree | 4698d3b6732815f7c25efc7f069e7e60c96bb14b | |
parent | d06821468e9a6e0d62c4b1ced21b1290e7a5bc47 (diff) | |
download | gnix-36a09fd6e452d2e6391a823a08787b5b17af7d08.tar gnix-36a09fd6e452d2e6391a823a08787b5b17af7d08.tar.bz2 gnix-36a09fd6e452d2e6391a823a08787b5b17af7d08.tar.zst |
h2
-rw-r--r-- | Cargo.lock | 1 | ||||
-rw-r--r-- | Cargo.toml | 8 | ||||
-rw-r--r-- | readme.md | 2 | ||||
-rw-r--r-- | src/main.rs | 58 |
4 files changed, 36 insertions, 33 deletions
@@ -794,6 +794,7 @@ dependencies = [ "http-body", "hyper", "pin-project-lite", + "tokio", ] [[package]] @@ -6,7 +6,13 @@ edition = "2021" [dependencies] # HTTP hyper = { version = "1.4.1", features = ["server", "client", "http1", "http2"] } -hyper-util = "0.1.7" +hyper-util = { version = "0.1.7", features = [ + "server-auto", + "server", + "http1", + "http2", + "tokio", +] } http-body-util = "0.1.2" headers = "0.4.0" percent-encoding = "2.3.1" @@ -4,7 +4,7 @@ a simple stupid reverse proxy ## Features -- HTTP/1.1 +- HTTP/1.1 and HTTP/2 - Simple to configure (see below) - Somewhat fast (about 150k req/s on a rpi5 for simple routes) - Composable modules diff --git a/src/main.rs b/src/main.rs index e286924..8ca86cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,10 +20,10 @@ use hyper::{ body::Incoming, header::{CONTENT_TYPE, HOST, SERVER}, http::HeaderValue, - server::conn::http1, service::service_fn, Request, Response, StatusCode, }; +use hyper_util::rt::TokioExecutor; use log::{debug, error, info, warn, LevelFilter}; use modules::{NodeContext, MODULES}; use std::{ @@ -150,10 +150,7 @@ async fn serve_https(state: Arc<State>) -> Result<()> { let mut cfg = rustls::ServerConfig::builder() .with_no_client_auth() .with_cert_resolver(Arc::new(certs)); - cfg.alpn_protocols = vec![ - // b"h2".to_vec(), - b"http/1.1".to_vec(), - ]; + cfg.alpn_protocols = vec![b"h2".to_vec(), b"http/1.1".to_vec()]; Arc::new(cfg) }; let tls_acceptor = Arc::new(TlsAcceptor::from(tls_config)); @@ -184,34 +181,33 @@ pub async fn serve_stream<T: Unpin + Send + 'static + hyper::rt::Read + hyper::r addr: SocketAddr, ) { if let Ok(_semaphore) = state.l_incoming.try_acquire() { - let conn = http1::Builder::new() - .serve_connection( - stream, - service_fn(|req| { - let state = state.clone(); - async move { - let config = state.config.read().await.clone(); - match service(state, config, req, addr).await { - Ok(r) => Ok(r), - Err(ServiceError::Hyper(e)) => Err(e), - Err(error) => Ok({ - warn!("service error {addr} {error:?}"); - let mut resp = Response::new(format!( - "Sorry, we were unable to process your request: {error}" - )); - *resp.status_mut() = StatusCode::BAD_REQUEST; - resp.headers_mut() - .insert(CONTENT_TYPE, HeaderValue::from_static("text/plain")); - resp.headers_mut() - .insert(SERVER, HeaderValue::from_static("gnix")); - resp - } - .map(|b| b.map_err(|e| match e {}).boxed())), + let builder = hyper_util::server::conn::auto::Builder::new(TokioExecutor::new()); + let conn = builder.serve_connection_with_upgrades( + stream, + service_fn(|req| { + let state = state.clone(); + async move { + let config = state.config.read().await.clone(); + match service(state, config, req, addr).await { + Ok(r) => Ok(r), + Err(ServiceError::Hyper(e)) => Err(e), + Err(error) => Ok({ + warn!("service error {addr} {error:?}"); + let mut resp = Response::new(format!( + "Sorry, we were unable to process your request: {error}" + )); + *resp.status_mut() = StatusCode::BAD_REQUEST; + resp.headers_mut() + .insert(CONTENT_TYPE, HeaderValue::from_static("text/plain")); + resp.headers_mut() + .insert(SERVER, HeaderValue::from_static("gnix")); + resp } + .map(|b| b.map_err(|e| match e {}).boxed())), } - }), - ) - .with_upgrades(); + } + }), + ); if let Err(err) = conn.await { warn!("error: {:?}", err); } |