From ff02a1e1806e4024ca450034ab21dd5c1be0d6e9 Mon Sep 17 00:00:00 2001 From: Oskar Date: Mon, 26 Sep 2022 20:04:28 +0000 Subject: [PATCH] feat: add support for disable https to run http server --- config.toml | 1 + src/config.rs | 1 + src/server/mod.rs | 60 +++++++++++++++++++++++++++++++---------------- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/config.toml b/config.toml index 0898867..8b541c3 100644 --- a/config.toml +++ b/config.toml @@ -1,6 +1,7 @@ [http] host = "0.0.0.0" httpPort = 8080 # http server port (recommended 80) +enableHttps = true # if true start https server and http will be redirect to https httpsPort = 8443 # https server port (recommended 443) cors = [ "localhost:8000" ] # CORS domains tlsCert = "./cert.pem" # TLS certificate file diff --git a/src/config.rs b/src/config.rs index 7acfd8c..a13e9eb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -14,6 +14,7 @@ pub struct Config { pub struct ConfigHTTP { pub host: String, pub http_port: u16, + pub enable_https: bool, pub https_port: u16, pub cors: Vec, pub tls_cert: String, diff --git a/src/server/mod.rs b/src/server/mod.rs index a1ec5b1..7788f7e 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -2,7 +2,10 @@ mod api; pub mod error; pub mod utils; -use std::{path::{PathBuf, Path}, process::exit}; +use std::{ + path::{Path, PathBuf}, + process::exit, +}; use anyhow::anyhow; use axum::{ @@ -18,21 +21,28 @@ use tower_http::{ cors::{AllowOrigin, CorsLayer}, BoxError, }; -use tracing::{debug, info, error}; +use tracing::{debug, error, info}; use crate::{config::Config, database::Database}; pub async fn start_server(config: Config, db: Database) -> anyhow::Result<()> { - let host = format!("{}:{}", config.http.host, config.http.https_port); + let host = if config.http.enable_https { + format!("{}:{}", config.http.host, config.http.https_port) + } else { + format!("{}:{}", config.http.host, config.http.http_port) + }; - // check if tls cert and key file exists - if !Path::new(&config.http.tls_cert).exists() || !Path::new(&config.http.tls_key).exists() { - error!("TLS cert or/and key file not found!"); - exit(1); + if config.http.enable_https { + // check if tls cert and key file exists + if !Path::new(&config.http.tls_cert).exists() || !Path::new(&config.http.tls_key).exists() { + error!("TLS cert or/and key file not found!"); + exit(1); + } + + // start http redirect to https + tokio::spawn(redirect_http_to_https(config.clone())); } - tokio::spawn(redirect_http_to_https(config.clone())); - info!("🚀 Server has launched on https://{host}"); // change the type from Vec to Vec so that the http server can correctly detect CORS hosts @@ -43,23 +53,33 @@ pub async fn start_server(config: Config, db: Database) -> anyhow::Result<()> { .map(|e| e.parse().expect("Failed to parse CORS hosts")) .collect::>(); - let tls_config = RustlsConfig::from_pem_file( - PathBuf::from("").join("").join(&config.http.tls_cert), - PathBuf::from("").join("").join(&config.http.tls_key), - ) - .await - .unwrap(); - let app = Router::new() .nest("/api", api::app()) .route("/", get(api::health)) .layer(CorsLayer::new().allow_origin(AllowOrigin::list(origins))) - .layer(Extension(config)) + .layer(Extension(config.clone())) .layer(Extension(db)); - axum_server::bind_rustls(host.parse()?, tls_config) - .serve(app.into_make_service()) - .await?; + // if https is enabled, run it, otherwise run server http + if config.http.enable_https { + // start https server + let tls_config = RustlsConfig::from_pem_file( + PathBuf::from("").join("").join(&config.http.tls_cert), + PathBuf::from("").join("").join(&config.http.tls_key), + ) + .await + .unwrap(); + + axum_server::bind_rustls(host.parse()?, tls_config) + .serve(app.into_make_service()) + .await?; + } else { + // start http server + axum::Server::bind(&host.parse().unwrap()) + .serve(app.into_make_service()) + .await + .unwrap(); + } Err(anyhow!("Server unexpected stopped!")) }