diff --git a/web/src/configuration.rs b/web/src/configuration.rs index 721e4fe..85f4855 100644 --- a/web/src/configuration.rs +++ b/web/src/configuration.rs @@ -1,5 +1,3 @@ -use std::net::Ipv4Addr; -use std::net::IpAddr; use std::path::PathBuf; use pronouns_today::PronounList; use pronouns_today::UserPreferences; @@ -64,13 +62,10 @@ pub struct Run { /// options will be filled in using sane defaults pub no_read_cfg: bool, - #[argh(option, short = 'p')] - /// the port to listen on - pub port: Option, - #[argh(option)] - /// the address to bind to - pub address: Option, + /// the address to bind to. can be an ip address and a port, like 0.0.0.0:1312, or a + /// unix socket like /run/programming.sock. defaults to 0.0.0.0:1312 + pub bind: Option, #[argh(option)] /// default pronoun probabilites (formatted as a prefstring, like the ones in the @@ -134,8 +129,9 @@ pub struct Conf { /// The port for the server to bind to. Defaults to 1312 pub port: u16, - /// The address to bind to. Defaults to 0.0.0.0 - pub address: IpAddr, + /// The address to bind to. Can be an ip address and a port, like 0.0.0.0:1312, or a + /// unix socket like /run/programming.sock. Defaults to 0.0.0.0:1312 + pub bind: String, /// The base url the server will be running under, with no trailing slash pub base_url: String, @@ -143,8 +139,7 @@ pub struct Conf { impl Conf { fn update_with(mut self, args: Run) -> Conf { - self.port = args.port.unwrap_or(self.port); - self.address = args.address.unwrap_or(self.address); + self.bind = args.bind.unwrap_or(self.bind); self.instance_settings.pronoun_list = args.pronouns.map(Into::into).unwrap_or(self.instance_settings.pronoun_list); self.base_url = args.base_url.unwrap_or(self.base_url); self @@ -156,7 +151,7 @@ impl Default for Conf { Conf { instance_settings: InstanceSettings::default(), port: 1312, - address: IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), + bind: "0.0.0.0:1312".into(), base_url: "https://pronouns.today".into(), } } diff --git a/web/src/main.rs b/web/src/main.rs index 305d506..39259c8 100644 --- a/web/src/main.rs +++ b/web/src/main.rs @@ -4,6 +4,7 @@ pub mod statics; pub mod configuration; mod write_vectored_all; +use async_net::unix::UnixListener; use crate::configuration::Conf; use std::io::IoSlice; use crate::statics::StaticAsset; @@ -80,24 +81,44 @@ fn main() { /// requests is delegated to the [`handle_request()`], which is the actual task that is /// spawned into the Executor. async fn start_server(config: configuration::Conf, executor: &LocalExecutor<'_>) -> std::io::Result<()> { - // Where we binding bois - let socket_addr = SocketAddr::new(config.address, config.port); - - println!("Starting pronouns-today-web on {}", &socket_addr); - - let connection = TcpListener::bind(socket_addr).await?; - let mut incoming = connection.incoming(); // Make the configuration immortal let config = Box::leak(Box::new(config)); - while let Some(stream) = incoming.next().await { - match stream { - Ok(stream) => { - executor.spawn(handle_request(stream, config)).detach(); - }, - Err(e) => { - log::error!("IO Error with client/server connection: {}", e); + // Where we binding bois + if let Ok(socket_addr) = config.bind.parse() as Result { + + println!("Starting pronouns-today-web on {}", &socket_addr); + + let connection = TcpListener::bind(socket_addr).await?; + let mut incoming = connection.incoming(); + + while let Some(stream) = incoming.next().await { + match stream { + Ok(stream) => { + executor.spawn(handle_request(stream, config)).detach(); + }, + Err(e) => { + log::error!("IO Error with client/server connection: {}", e); + } + } + } + + } else { + let bind = config.bind.trim_start_matches("unix:"); + let listener = UnixListener::bind(bind)?; + + println!("Listening for connections on unix:{}", bind); + + let mut incoming = listener.incoming(); + while let Some(stream) = incoming.next().await { + match stream { + Ok(stream) => { + executor.spawn(handle_request(stream, config)).detach(); + }, + Err(e) => { + log::error!("IO Error with client/server connection: {}", e); + } } } }