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
  • Learn to ignore specific revisions
  • 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
    }