Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//! # 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
}