From da2cc2a344a44c10f8686c600cdf63c433e9be13 Mon Sep 17 00:00:00 2001 From: nazeh Date: Tue, 3 Dec 2024 16:37:55 +0300 Subject: [PATCH] feat(homeserver): add http server as well as https --- pubky-homeserver/src/io/http.rs | 90 ++++++++++++++++++++++++++------- pubky-homeserver/src/io/mod.rs | 25 +++++---- 2 files changed, 84 insertions(+), 31 deletions(-) diff --git a/pubky-homeserver/src/io/http.rs b/pubky-homeserver/src/io/http.rs index c6f7e21..9b414ab 100644 --- a/pubky-homeserver/src/io/http.rs +++ b/pubky-homeserver/src/io/http.rs @@ -13,22 +13,76 @@ use axum_server::{ use crate::core::HomeserverCore; -pub(crate) async fn start(core: HomeserverCore) -> Result { - let listener = TcpListener::bind(SocketAddr::from(([0, 0, 0, 0], core.config.port())))?; - - let acceptor = RustlsAcceptor::new(RustlsConfig::from_config(Arc::new( - core.keypair().to_rpk_rustls_server_config(), - ))); - let server = axum_server::from_tcp(listener).acceptor(acceptor); - - let handle = Handle::new(); - - tokio::spawn( - server.handle(handle.clone()).serve( - core.router - .into_make_service_with_connect_info::(), - ), - ); - - Ok(handle) +#[derive(Debug)] +pub struct HttpServers { + /// Handle for the HTTP server + pub(crate) http_handle: Handle, + /// Handle for the HTTPS server using Pkarr TLS + pub(crate) https_handle: Handle, + // /// Handle for a mock relay used in testnet + // pub(crate) mock_pkarr_relay_handle: Handle, +} + +impl HttpServers { + pub async fn start(core: &HomeserverCore) -> Result { + let http_listener = + // TODO: add config to http port + TcpListener::bind(SocketAddr::from(([0, 0, 0, 0], 0)))?; + + let http_handle = Handle::new(); + + tokio::spawn( + axum_server::from_tcp(http_listener) + .handle(http_handle.clone()) + .serve( + core.router + .clone() + .into_make_service_with_connect_info::(), + ), + ); + + let https_listener = + TcpListener::bind(SocketAddr::from(([0, 0, 0, 0], core.config.port())))?; + + let https_handle = Handle::new(); + + tokio::spawn( + axum_server::from_tcp(https_listener) + .acceptor(RustlsAcceptor::new(RustlsConfig::from_config(Arc::new( + core.keypair().to_rpk_rustls_server_config(), + )))) + .handle(https_handle.clone()) + .serve( + core.router + .clone() + .into_make_service_with_connect_info::(), + ), + ); + + // let mock_pkarr_relay_listener = TcpListener::bind(SocketAddr::from(([0, 0, 0, 0], 15411)))?; + + Ok(Self { + http_handle, + https_handle, + }) + } + + pub async fn http_address(&self) -> Result { + match self.http_handle.listening().await { + Some(addr) => Ok(addr), + None => Err(anyhow::anyhow!("Failed to bind to http port")), + } + } + + pub async fn https_address(&self) -> Result { + match self.https_handle.listening().await { + Some(addr) => Ok(addr), + None => Err(anyhow::anyhow!("Failed to bind to https port")), + } + } + + pub fn shutdown(&self) { + self.http_handle.shutdown(); + self.https_handle.shutdown(); + } } diff --git a/pubky-homeserver/src/io/mod.rs b/pubky-homeserver/src/io/mod.rs index e1e7713..efb5a53 100644 --- a/pubky-homeserver/src/io/mod.rs +++ b/pubky-homeserver/src/io/mod.rs @@ -1,6 +1,6 @@ use ::pkarr::{mainline::Testnet, PublicKey}; use anyhow::Result; -use axum_server::Handle; +use http::HttpServers; use pkarr::PkarrServer; use tracing::info; @@ -12,7 +12,7 @@ mod pkarr; #[derive(Debug)] /// Homeserver [Core][HomeserverCore] + I/O (http server and pkarr publishing). pub struct Homeserver { - handle: Handle, + http_servers: HttpServers, core: HomeserverCore, } @@ -24,24 +24,23 @@ impl Homeserver { let core = unsafe { HomeserverCore::new(&config)? }; - let handle = http::start(core.clone()).await?; + let http_servers = HttpServers::start(&core).await?; - let port = handle - .listening() - .await - .expect("Homeserver listening") - .port(); - - info!("Homeserver listening on http://localhost:{port}"); + info!( + "Homeserver listening on http://localhost:{}", + http_servers.http_address().await?.port() + ); info!("Publishing Pkarr packet.."); let pkarr_server = PkarrServer::new(config)?; - pkarr_server.publish_server_packet(port).await?; + pkarr_server + .publish_server_packet(http_servers.https_address().await?.port()) + .await?; info!("Homeserver listening on https://{}", core.public_key()); - Ok(Self { handle, core }) + Ok(Self { http_servers, core }) } /// Test version of [Homeserver::start], using mainline Testnet, and a temporary storage. @@ -66,6 +65,6 @@ impl Homeserver { /// Send a shutdown signal to all open resources pub fn shutdown(&self) { - self.handle.shutdown(); + self.http_servers.shutdown(); } }