|
|
|
|
|
|
|
#![forbid(unsafe_code, clippy::panic)] |
|
#![deny(missing_docs, clippy::missing_docs_in_private_items, clippy::perf)] |
|
#![warn(clippy::cognitive_complexity, rust_2018_idioms)] |
|
|
|
pub mod cache; |
|
pub mod config; |
|
pub mod engines; |
|
pub mod handler; |
|
pub mod models; |
|
pub mod results; |
|
pub mod server; |
|
|
|
use std::net::TcpListener; |
|
|
|
use crate::server::router; |
|
|
|
use actix_cors::Cors; |
|
use actix_files as fs; |
|
use actix_governor::{Governor, GovernorConfigBuilder}; |
|
use actix_web::{dev::Server, http::header, middleware::Logger, web, App, HttpServer}; |
|
use cache::cacher::{Cache, SharedCache}; |
|
use config::parser::Config; |
|
use handlebars::Handlebars; |
|
use handler::paths::{file_path, FileType}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn run(listener: TcpListener, config: Config, cache: Cache) -> std::io::Result<Server> { |
|
let mut handlebars: Handlebars<'_> = Handlebars::new(); |
|
|
|
let public_folder_path: &str = file_path(FileType::Theme)?; |
|
|
|
handlebars |
|
.register_templates_directory(".html", format!("{}/templates", public_folder_path)) |
|
.unwrap(); |
|
|
|
let handlebars_ref: web::Data<Handlebars<'_>> = web::Data::new(handlebars); |
|
|
|
let cloned_config_threads_opt: u8 = config.threads; |
|
|
|
let cache = web::Data::new(SharedCache::new(cache)); |
|
|
|
let server = HttpServer::new(move || { |
|
let cors: Cors = Cors::default() |
|
.allow_any_origin() |
|
.allowed_methods(vec!["GET"]) |
|
.allowed_headers(vec![ |
|
header::ORIGIN, |
|
header::CONTENT_TYPE, |
|
header::REFERER, |
|
header::COOKIE, |
|
]); |
|
|
|
App::new() |
|
.wrap(Logger::default()) |
|
.app_data(handlebars_ref.clone()) |
|
.app_data(web::Data::new(config.clone())) |
|
.app_data(cache.clone()) |
|
.wrap(cors) |
|
.wrap(Governor::new( |
|
&GovernorConfigBuilder::default() |
|
.per_second(config.rate_limiter.time_limit as u64) |
|
.burst_size(config.rate_limiter.number_of_requests as u32) |
|
.finish() |
|
.unwrap(), |
|
)) |
|
|
|
.service( |
|
fs::Files::new("/static", format!("{}/static", public_folder_path)) |
|
.show_files_listing(), |
|
) |
|
.service( |
|
fs::Files::new("/images", format!("{}/images", public_folder_path)) |
|
.show_files_listing(), |
|
) |
|
.service(router::robots_data) |
|
.service(router::index) |
|
.service(server::routes::search::search) |
|
.service(router::about) |
|
.service(router::settings) |
|
.default_service(web::route().to(router::not_found)) |
|
}) |
|
.workers(cloned_config_threads_opt as usize) |
|
|
|
.listen(listener)? |
|
.run(); |
|
Ok(server) |
|
} |
|
|