From 41ab8a2a768ec746c8030351e8920fc2ac082ee5 Mon Sep 17 00:00:00 2001 From: ddotthomas Date: Wed, 28 Feb 2024 05:08:29 -0700 Subject: [PATCH] :sparkles: config option to configure the https adaptive window size for requests (#529) * Added config option to enable the reqwest client adaptive window * Change adaptive window config name Co-authored-by: neon_arch * Modified documentation * Trimmed down aggregate parameters --------- Co-authored-by: neon_arch --- src/config/parser.rs | 4 ++++ src/results/aggregator.rs | 10 +++++----- src/server/routes/search.rs | 4 +--- websurfx/config.lua | 2 ++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/config/parser.rs b/src/config/parser.rs index 63329c5..4494db3 100644 --- a/src/config/parser.rs +++ b/src/config/parser.rs @@ -30,6 +30,8 @@ pub struct Config { pub logging: bool, /// It stores the option to whether enable or disable debug mode. pub debug: bool, + /// It toggles whether to use adaptive HTTP windows + pub adaptive_window: bool, /// It stores all the engine names that were enabled by the user. pub upstream_search_engines: HashMap, /// It stores the time (secs) which controls the server request timeout. @@ -68,6 +70,7 @@ impl Config { let debug: bool = globals.get::<_, bool>("debug")?; let logging: bool = globals.get::<_, bool>("logging")?; + let adaptive_window: bool = globals.get::<_, bool>("adaptive_window")?; if !logging_initialized { set_logging_level(debug, logging); @@ -125,6 +128,7 @@ impl Config { }, logging, debug, + adaptive_window, upstream_search_engines: globals .get::<_, HashMap>("upstream_search_engines")?, request_timeout: globals.get::<_, u8>("request_timeout")?, diff --git a/src/results/aggregator.rs b/src/results/aggregator.rs index e7fc090..a95fb33 100644 --- a/src/results/aggregator.rs +++ b/src/results/aggregator.rs @@ -2,6 +2,7 @@ //! search engines and then removes duplicate results. use super::user_agent::random_user_agent; +use crate::config::parser::Config; use crate::handler::{file_path, FileType}; use crate::models::{ aggregation_models::{EngineErrorInfo, SearchResult, SearchResults}, @@ -66,18 +67,17 @@ type FutureVec = Vec, Report Result> { let client = CLIENT.get_or_init(|| { ClientBuilder::new() - .timeout(Duration::from_secs(request_timeout as u64)) // Add timeout to request to avoid DDOSing the server + .timeout(Duration::from_secs(config.request_timeout as u64)) // Add timeout to request to avoid DDOSing the server .https_only(true) .gzip(true) .brotli(true) + .http2_adaptive_window(config.adaptive_window) .build() .unwrap() }); @@ -85,7 +85,7 @@ pub async fn aggregate( let user_agent: &str = random_user_agent(); // Add a random delay before making the request. - if random_delay || !debug { + if config.aggregator.random_delay || !config.debug { let nanos = SystemTime::now().duration_since(UNIX_EPOCH)?.subsec_nanos() as f32; let delay = ((nanos / 1_0000_0000 as f32).floor() as u64) + 1; tokio::time::sleep(Duration::from_secs(delay)).await; diff --git a/src/server/routes/search.rs b/src/server/routes/search.rs index 16cfa28..a5b2558 100644 --- a/src/server/routes/search.rs +++ b/src/server/routes/search.rs @@ -209,14 +209,12 @@ async fn results( aggregate( query, page, - config.aggregator.random_delay, - config.debug, + config, &search_settings .engines .iter() .filter_map(|engine| EngineHandler::new(engine).ok()) .collect::>(), - config.request_timeout, safe_search_level, ) .await? diff --git a/websurfx/config.lua b/websurfx/config.lua index ce2d609..3b6c4ab 100644 --- a/websurfx/config.lua +++ b/websurfx/config.lua @@ -14,6 +14,8 @@ rate_limiter = { number_of_requests = 20, -- The number of request that are allowed within a provided time limit. time_limit = 3, -- The time limit in which the quantity of requests that should be accepted. } +-- Set whether the server will use an adaptive/dynamic HTTPS window size, see https://httpwg.org/specs/rfc9113.html#fc-principles +https_adaptive_window_size = false -- ### Search ### -- Filter results based on different levels. The levels provided are: