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<()> { // 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"); HttpServer::new(|| { 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)? .run() .await }