Newer
Older
use actix_web::{get, App, HttpResponse, HttpServer, Responder};
#[get("/{pth:.*}")]
async fn page(pth: actix_web::web::Path<String>) -> impl Responder {
HttpResponse::Ok().body(format!("Page path {}", pth))
}
#[get("/admin/dashboard")]
async fn admin_dashboard() -> impl Responder {
HttpResponse::Ok().body("Admin")
}
#[get("/admin/login")]
async fn admin_login() -> impl Responder {
HttpResponse::Ok().body("Login")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
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
// GET HOST AND CERTS DIR FROM CLI ARGUMENT
// Get port from arg, or get context from arg and define default port, or set default port to standard
// LOAD A WEBSITE SCHEMA (JSON) FROM CLI ARGUMENT PATH OR CREATE A NEW ONE
// create pages resources with templates and the contents from the json file
// Save the resources in an appstate
// create the static dir
// create the static files index (like Arc<Mutex<Index>>)
// create a Rest service at root with extensive path argument: like #[get(/{pth:.*})]
// Then parse the website document and return the corresponding template, or 404 template
let host = "localhost";
let certs_dir = std::path::PathBuf::from("/etc/letsencrypt/live").join(host);
let cert_file =
&mut std::io::BufReader::new(std::fs::File::open(certs_dir.join("fullchain.pem")).unwrap());
let key_file =
&mut std::io::BufReader::new(std::fs::File::open(certs_dir.join("privkey.pem")).unwrap());
let cert = rustls::Certificate(rustls_pemfile::certs(cert_file).unwrap().remove(0).to_vec());
let key = rustls::PrivateKey(
rustls_pemfile::pkcs8_private_keys(key_file)
.unwrap()
.remove(0)
.to_vec(),
);
let srv_conf = rustls::ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth()
.with_single_cert(vec![cert], key)
.expect("bad certificate/key");
App::new()
.wrap(actix_web::middleware::Logger::default())
.service(admin_dashboard)
.service(admin_login)
.service(page)
.bind("127.0.0.1:8080")?
.bind_rustls("127.0.0.1:8443", srv_conf)?