commit b22564cb000febe9a871f2121d96993ff5569c7b
parent 16eb0a56f9767b33256ab6c9d66b5dd49af22e6e
Author: Jake Howard <git@theorangeone.net>
Date: Sat, 27 Mar 2021 13:30:40 +0000
Cache icons on the client
This should make the vault pages load much faster, and massively reduce the number of requests.
Diffstat:
2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/src/api/icons.rs b/src/api/icons.rs
@@ -51,7 +51,10 @@ fn icon(domain: String) -> Option<Cached<Content<Vec<u8>>>> {
return None;
}
- get_icon(&domain).map(|icon| Cached::long(Content(ContentType::new("image", "x-icon"), icon)))
+ get_icon(&domain).map(|(icon, cached)| {
+ let cache_ttl = if cached {CONFIG.icon_cache_ttl()} else {CONFIG.icon_cache_negttl()};
+ Cached::ttl(Content(ContentType::new("image", "x-icon"), icon), cache_ttl)
+ })
}
/// Returns if the domain provided is valid or not.
@@ -238,7 +241,7 @@ fn is_domain_blacklisted(domain: &str) -> bool {
is_blacklisted
}
-fn get_icon(domain: &str) -> Option<Vec<u8>> {
+fn get_icon(domain: &str) -> Option<(Vec<u8>, bool)> {
let path = format!("{}/{}.png", CONFIG.icon_cache_folder(), domain);
// Check for expiration of negatively cached copy
@@ -247,7 +250,7 @@ fn get_icon(domain: &str) -> Option<Vec<u8>> {
}
if let Some(icon) = get_cached_icon(&path) {
- return Some(icon);
+ return Some((icon, true));
}
if CONFIG.disable_icon_download() {
@@ -258,7 +261,7 @@ fn get_icon(domain: &str) -> Option<Vec<u8>> {
match download_icon(&domain) {
Ok(icon) => {
save_icon(&path, &icon);
- Some(icon)
+ Some((icon, false))
}
Err(e) => {
error!("Error downloading icon: {:?}", e);
@@ -472,7 +475,7 @@ fn get_icon_url(domain: &str) -> Result<IconUrlResult, Error> {
let dom = html5ever::parse_document(markup5ever_rcdom::RcDom::default(), Default::default())
.from_utf8()
.read_from(&mut limited_reader)?;
-
+
get_favicons_node(&dom.document, &mut iconlist, &url);
} else {
// Add the default favicon.ico to the list with just the given domain
diff --git a/src/util.rs b/src/util.rs
@@ -92,17 +92,21 @@ impl Fairing for CORS {
}
}
-pub struct Cached<R>(R, &'static str);
+pub struct Cached<R>(R, String);
impl<R> Cached<R> {
- pub const fn long(r: R) -> Cached<R> {
+ pub fn long(r: R) -> Cached<R> {
// 7 days
- Self(r, "public, max-age=604800")
+ Self(r, String::from("public, max-age=604800"))
}
- pub const fn short(r: R) -> Cached<R> {
+ pub fn short(r: R) -> Cached<R> {
// 10 minutes
- Self(r, "public, max-age=600")
+ Self(r, String::from("public, max-age=600"))
+ }
+
+ pub fn ttl(r: R, ttl: u64) -> Cached<R> {
+ Self(r, format!("public, immutable, max-age={}", ttl))
}
}