summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs69
1 files changed, 37 insertions, 32 deletions
diff --git a/src/main.rs b/src/main.rs
index 3d4e764..b39eea7 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -169,7 +169,12 @@ 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()];
+ if !https_config.disable_h1 {
+ cfg.alpn_protocols.push(b"http/1.1".to_vec());
+ }
+ if !https_config.disable_h2 {
+ cfg.alpn_protocols.push(b"h2".to_vec());
+ }
Arc::new(cfg)
};
let tls_acceptor = Arc::new(TlsAcceptor::from(tls_config));
@@ -200,6 +205,37 @@ async fn serve_https(state: Arc<State>) -> Result<()> {
Ok(())
}
+pub async fn serve_stream<T: Unpin + Send + 'static + hyper::rt::Read + hyper::rt::Write>(
+ state: Arc<State>,
+ stream: T,
+ addr: SocketAddr,
+ secure: bool,
+ listen_addr: SocketAddr,
+) {
+ if let Ok(_semaphore) = state.l_incoming.try_acquire() {
+ 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 req = req.map(|body: Incoming| body.map_err(ServiceError::Hyper).boxed());
+ match service(state, req, addr, secure, listen_addr).await {
+ Ok(r) => Ok(r),
+ Err(ServiceError::Hyper(e)) => Err(e),
+ Err(error) => Ok(error_response(addr, error)),
+ }
+ }
+ }),
+ );
+ if let Err(err) = conn.await {
+ warn!("error: {:?}", err);
+ }
+ } else {
+ warn!("connection dropped: too many incoming");
+ }
+}
+
async fn serve_h3(state: Arc<State>) -> Result<()> {
let config = state.config.read().await.clone();
let https_config = match &config.https {
@@ -310,37 +346,6 @@ async fn serve_h3(state: Arc<State>) -> Result<()> {
Ok(())
}
-pub async fn serve_stream<T: Unpin + Send + 'static + hyper::rt::Read + hyper::rt::Write>(
- state: Arc<State>,
- stream: T,
- addr: SocketAddr,
- secure: bool,
- listen_addr: SocketAddr,
-) {
- if let Ok(_semaphore) = state.l_incoming.try_acquire() {
- 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 req = req.map(|body: Incoming| body.map_err(ServiceError::Hyper).boxed());
- match service(state, req, addr, secure, listen_addr).await {
- Ok(r) => Ok(r),
- Err(ServiceError::Hyper(e)) => Err(e),
- Err(error) => Ok(error_response(addr, error)),
- }
- }
- }),
- );
- if let Err(err) = conn.await {
- warn!("error: {:?}", err);
- }
- } else {
- warn!("connection dropped: too many incoming");
- }
-}
-
fn error_response(addr: SocketAddr, error: ServiceError) -> Response<BoxBody<Bytes, ServiceError>> {
{
warn!("service error {addr} {error:?}");