Spaces:
Running
Running
ddotthomas
commited on
Commit
·
80e950d
1
Parent(s):
a47e285
refactor: changed Cookie to use Cow to facilitate using references when building
Browse files- src/models/server_models.rs +9 -7
- src/server/routes/search.rs +34 -43
src/models/server_models.rs
CHANGED
@@ -1,5 +1,7 @@
|
|
1 |
//! This module provides the models to parse cookies and search parameters from the search
|
2 |
//! engine website.
|
|
|
|
|
3 |
use serde::Deserialize;
|
4 |
|
5 |
use super::parser_models::Style;
|
@@ -23,23 +25,23 @@ pub struct SearchParams {
|
|
23 |
#[derive(Deserialize)]
|
24 |
pub struct Cookie<'a> {
|
25 |
/// It stores the theme name used in the website.
|
26 |
-
pub theme:
|
27 |
/// It stores the colorscheme name used for the website theme.
|
28 |
-
pub colorscheme:
|
29 |
/// It stores the user selected upstream search engines selected from the UI.
|
30 |
-
pub engines: Vec<
|
31 |
/// It stores the user selected safe search level from the UI.
|
32 |
pub safe_search_level: u8,
|
33 |
}
|
34 |
|
35 |
impl<'a> Cookie<'a> {
|
36 |
/// server_models::Cookie contructor function
|
37 |
-
pub fn build(style: &'a Style, mut engines: Vec<
|
38 |
engines.sort();
|
39 |
Self {
|
40 |
-
theme: &style.theme,
|
41 |
-
colorscheme: &style.colorscheme,
|
42 |
-
engines,
|
43 |
safe_search_level,
|
44 |
}
|
45 |
}
|
|
|
1 |
//! This module provides the models to parse cookies and search parameters from the search
|
2 |
//! engine website.
|
3 |
+
use std::borrow::Cow;
|
4 |
+
|
5 |
use serde::Deserialize;
|
6 |
|
7 |
use super::parser_models::Style;
|
|
|
25 |
#[derive(Deserialize)]
|
26 |
pub struct Cookie<'a> {
|
27 |
/// It stores the theme name used in the website.
|
28 |
+
pub theme: Cow<'a, str>,
|
29 |
/// It stores the colorscheme name used for the website theme.
|
30 |
+
pub colorscheme: Cow<'a, str>,
|
31 |
/// It stores the user selected upstream search engines selected from the UI.
|
32 |
+
pub engines: Cow<'a, Vec<Cow<'a, str>>>,
|
33 |
/// It stores the user selected safe search level from the UI.
|
34 |
pub safe_search_level: u8,
|
35 |
}
|
36 |
|
37 |
impl<'a> Cookie<'a> {
|
38 |
/// server_models::Cookie contructor function
|
39 |
+
pub fn build(style: &'a Style, mut engines: Vec<Cow<'a, str>>, safe_search_level: u8) -> Self {
|
40 |
engines.sort();
|
41 |
Self {
|
42 |
+
theme: Cow::Borrowed(&style.theme),
|
43 |
+
colorscheme: Cow::Borrowed(&style.colorscheme),
|
44 |
+
engines: Cow::Owned(engines),
|
45 |
safe_search_level,
|
46 |
}
|
47 |
}
|
src/server/routes/search.rs
CHANGED
@@ -14,6 +14,7 @@ use crate::{
|
|
14 |
use actix_web::{get, http::header::ContentType, web, HttpRequest, HttpResponse};
|
15 |
use regex::Regex;
|
16 |
use std::{
|
|
|
17 |
fs::File,
|
18 |
io::{BufRead, BufReader, Read},
|
19 |
};
|
@@ -48,37 +49,30 @@ pub async fn search(
|
|
48 |
.finish());
|
49 |
}
|
50 |
|
51 |
-
// Closure to build a server_models::Cookie capturing local references
|
52 |
-
let build_cookie = || {
|
53 |
-
server_models::Cookie::build(
|
54 |
-
&config.style,
|
55 |
-
config
|
56 |
-
.upstream_search_engines
|
57 |
-
.clone()
|
58 |
-
.into_iter()
|
59 |
-
.filter_map(|engine_map| engine_map.1.then_some(engine_map.0))
|
60 |
-
.collect(),
|
61 |
-
config.safe_search,
|
62 |
-
)
|
63 |
-
};
|
64 |
-
|
65 |
let cookie = req.cookie("appCookie");
|
66 |
|
67 |
// Get search settings using the user's cookie or from the server's config
|
68 |
-
let mut search_settings: server_models::Cookie<'_> =
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
|
|
|
|
|
|
|
|
79 |
|
80 |
-
|
81 |
-
|
|
|
|
|
|
|
82 |
|
83 |
// Closure wrapping the results function capturing local references
|
84 |
let get_results = |page| results(&config, &cache, query, page, &search_settings);
|
@@ -178,8 +172,7 @@ async fn results(
|
|
178 |
config.debug,
|
179 |
&search_settings
|
180 |
.engines
|
181 |
-
.
|
182 |
-
.into_iter()
|
183 |
.filter_map(|engine| EngineHandler::new(&engine).ok())
|
184 |
.collect::<Vec<EngineHandler>>(),
|
185 |
config.request_timeout,
|
@@ -233,23 +226,21 @@ fn is_match_from_filter_list(
|
|
233 |
Ok(false)
|
234 |
}
|
235 |
|
236 |
-
/// A helper function
|
237 |
-
///
|
|
|
238 |
///
|
239 |
/// # Argurments
|
240 |
///
|
241 |
-
/// * `
|
242 |
-
/// * `
|
243 |
-
/// * `
|
244 |
-
fn get_safesearch_level(safe_search: &Option<u8>,
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
*ss
|
251 |
-
}
|
252 |
}
|
253 |
-
None => default,
|
254 |
}
|
255 |
}
|
|
|
14 |
use actix_web::{get, http::header::ContentType, web, HttpRequest, HttpResponse};
|
15 |
use regex::Regex;
|
16 |
use std::{
|
17 |
+
borrow::Cow,
|
18 |
fs::File,
|
19 |
io::{BufRead, BufReader, Read},
|
20 |
};
|
|
|
49 |
.finish());
|
50 |
}
|
51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
let cookie = req.cookie("appCookie");
|
53 |
|
54 |
// Get search settings using the user's cookie or from the server's config
|
55 |
+
let mut search_settings: server_models::Cookie<'_> = cookie
|
56 |
+
.and_then(|cookie_value| serde_json::from_str(cookie_value.value()).ok())
|
57 |
+
.unwrap_or_else(|| {
|
58 |
+
server_models::Cookie::build(
|
59 |
+
&config.style,
|
60 |
+
config
|
61 |
+
.upstream_search_engines
|
62 |
+
.iter()
|
63 |
+
.filter_map(|(engine, enabled)| {
|
64 |
+
enabled.then_some(Cow::Borrowed(engine.as_str()))
|
65 |
+
})
|
66 |
+
.collect(),
|
67 |
+
config.safe_search,
|
68 |
+
)
|
69 |
+
});
|
70 |
|
71 |
+
get_safesearch_level(
|
72 |
+
&mut search_settings.safe_search_level,
|
73 |
+
¶ms.safesearch,
|
74 |
+
config.safe_search,
|
75 |
+
);
|
76 |
|
77 |
// Closure wrapping the results function capturing local references
|
78 |
let get_results = |page| results(&config, &cache, query, page, &search_settings);
|
|
|
172 |
config.debug,
|
173 |
&search_settings
|
174 |
.engines
|
175 |
+
.iter()
|
|
|
176 |
.filter_map(|engine| EngineHandler::new(&engine).ok())
|
177 |
.collect::<Vec<EngineHandler>>(),
|
178 |
config.request_timeout,
|
|
|
226 |
Ok(false)
|
227 |
}
|
228 |
|
229 |
+
/// A helper function to modify the safe search level based on the url params.
|
230 |
+
/// The `safe_search` is the one in the user's cookie or
|
231 |
+
/// the default set by the server config if the cookie was missing.
|
232 |
///
|
233 |
/// # Argurments
|
234 |
///
|
235 |
+
/// * `url_level` - Safe search level from the url.
|
236 |
+
/// * `safe_search` - User's cookie, or the safe search level set by the server
|
237 |
+
/// * `config_level` - Safe search level to fall back to
|
238 |
+
fn get_safesearch_level(safe_search: &mut u8, url_level: &Option<u8>, config_level: u8) {
|
239 |
+
if let Some(search_level) = url_level {
|
240 |
+
if *search_level >= 3 {
|
241 |
+
*safe_search = config_level
|
242 |
+
} else {
|
243 |
+
*safe_search = *search_level;
|
|
|
|
|
244 |
}
|
|
|
245 |
}
|
246 |
}
|