// This file is part of Locus . // Copyright (C) 2022-2022 Fuwn // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, version 3. // // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // Copyright (C) 2022-2022 Fuwn // SPDX-License-Identifier: GPL-3.0-only use std::sync::{LazyLock, Mutex}; use tokio::time::Instant; use windmark::context::HookContext; use crate::route::{CACHE_RATE, ROUTES}; fn cache(context: &windmark::context::HookContext, response: &str) { static LAST_CACHED: LazyLock> = LazyLock::new(|| Mutex::new(Instant::now())); if (*LAST_CACHED.lock().unwrap()).elapsed() >= std::time::Duration::from_secs(CACHE_RATE) || (*ROUTES.lock().unwrap()) .get(context.url.path()) .is_some_and(|r| r.text_cache.is_empty()) { (*LAST_CACHED.lock().unwrap()) = Instant::now(); if let Some(route) = (*ROUTES.lock().unwrap()).get_mut(context.url.path()) { route.text_cache = response.to_string(); info!("cache set for {}", context.url.path()); } else { warn!( "cache could not be set for {} as it is not being tracked", context.url.path() ); } trace!("recache for {}", { let path = context.url.path(); if path.is_empty() { "/" } else { path } }); } } pub fn module(router: &mut windmark::router::Router) { router.set_pre_route_callback(move |context: HookContext| { info!( "accepted connection from {} to {}", context.peer_address.unwrap().ip(), context.url.to_string(), ); super::ticker::module(&context); }); router.set_post_route_callback({ |context: HookContext, response: &mut windmark::response::Response| { info!( "closed connection from {} to {}", context.peer_address.unwrap().ip(), context.url.to_string(), ); cache(&context, &response.content); if let Some(language) = windmark::utilities::queries_from_url(&context.url).get("translate") { if super::translate::module(&context, response, language).is_err() { response.content = format!( "An error occurred during the translation process. Your language \ might not be supported.\n\n=> {} View Original\n\n{}", context .url .to_string() .replace(&format!("translate={language}"), ""), response.content ); } } } }); }