Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
main.rs 2.72 KiB
Newer Older
Pierre Jarriges's avatar
Pierre Jarriges committed
//! # REST API server for the Mentalo application
mod env;
mod standard_static_files;
mod tls;
use actix_files::Files;
use actix_web::{
    middleware::Logger,
    web::{get, resource, to},
    App, HttpResponse, HttpServer,
};
use actix_web_middleware_redirect_https::RedirectHTTPS;
use env::get_log_level;
use env_logger::Env;
use standard_static_files::{favicon, robots, sitemap};
use std::env::var as env_var;
use tls::get_tls_config;

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    env_logger::Builder::from_env(Env::default().default_filter_or(get_log_level())).init();

    let server_port = env_var("SERVER_PORT").expect("SERVER_PORT is not defined.");
    let server_port_tls = env_var("SERVER_PORT_TLS").expect("SERVER_PORT_TLS is not defined.");
    let public_dir =
        std::path::PathBuf::from(env_var("RESOURCES_DIR").expect("RESOURCES_DIR is not defined"))
            .join("public");

    HttpServer::new(move || {
        App::new()
            .wrap(Logger::default())
            // Redirect all requests to https
            .wrap(RedirectHTTPS::with_replacements(&[(
                format!(":{}", server_port),
                format!(":{}", server_port_tls),
            )]))
            // .wrap(NormalizePath::new(TrailingSlash::Trim))
            // Allow json payload to have size until ~32MB
            // .app_data(JsonConfig::default().limit(1 << 25u8))
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // STANDARD FILES ///////////////////////////////////////////////////////////////////////////////////////////
            .service(resource("/favicon.ico").route(get().to(favicon)))
            .service(resource("/robots.txt").route(get().to(robots)))
            .service(resource("/sitemap.xml").route(get().to(sitemap)))
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // PUBLIC WEBSITE //////////////////////////////////////////////////////////////////////////////////////////////
            .service(Files::new("/", &public_dir).index_file("index.html"))
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // empty 404 ////////////////////////////////////////////////////////////////////////////////////////////////
            .default_service(to(|| {
                HttpResponse::NotFound().body("<h1>404 - Page not found</h1>")
            }))
    })
    .bind(format!("0.0.0.0:{}", env_var("SERVER_PORT").unwrap()))?
    .bind_rustls(
        format!("0.0.0.0:{}", env_var("SERVER_PORT_TLS").unwrap()),
        get_tls_config(),
    )?
    .run()
    .await
}