vw_small

Hardened fork of Vaultwarden (https://github.com/dani-garcia/vaultwarden) with fewer features.
git clone https://git.philomathiclife.com/repos/vw_small
Log | Files | Refs | README

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:
Msrc/api/icons.rs | 13++++++++-----
Msrc/util.rs | 14+++++++++-----
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)) } }