diff --git a/src/api/icons.rs b/src/api/icons.rs index f403c69..0bac31c 100644 --- a/src/api/icons.rs +++ b/src/api/icons.rs @@ -104,9 +104,6 @@ fn get_icon(domain: &str) -> Vec { return FALLBACK_ICON.to_vec(); } - // Create icon_cache_folder before fetching - create_dir_all(&CONFIG.icon_cache_folder()).expect("Error creating icon cache"); - // Get the icon, or fallback in case of error match download_icon(&domain) { Ok(icon) => { @@ -115,7 +112,9 @@ fn get_icon(domain: &str) -> Vec { } Err(e) => { error!("Error downloading icon: {:?}", e); - mark_negcache(&path); + let miss_indicator = path.to_owned() + ".miss"; + let empty_icon = Vec::new(); + save_icon(&miss_indicator, &empty_icon); FALLBACK_ICON.to_vec() } } @@ -171,11 +170,6 @@ fn icon_is_negcached(path: &str) -> bool { } } -fn mark_negcache(path: &str) { - let miss_indicator = path.to_owned() + ".miss"; - File::create(&miss_indicator).expect("Error creating negative cache marker"); -} - fn icon_is_expired(path: &str) -> bool { let expired = file_is_expired(path, CONFIG.icon_cache_ttl()); expired.unwrap_or(true) @@ -398,9 +392,17 @@ fn download_icon(domain: &str) -> Result, Error> { } fn save_icon(path: &str, icon: &[u8]) { - if let Ok(mut f) = File::create(path) { - f.write_all(icon).expect("Error writing icon file"); - }; + match File::create(path) { + Ok(mut f) => { + f.write_all(icon).expect("Error writing icon file"); + } + Err(ref e) if e.kind() == std::io::ErrorKind::NotFound => { + create_dir_all(&CONFIG.icon_cache_folder()).expect("Error creating icon cache"); + } + Err(e) => { + info!("Icon save error: {:?}", e); + } + } } fn _header_map() -> HeaderMap { diff --git a/src/main.rs b/src/main.rs index c23eca6..862b53b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,6 +25,7 @@ extern crate num_derive; use std::{ path::Path, process::{exit, Command}, + fs::create_dir_all, }; #[macro_use] @@ -52,6 +53,8 @@ fn main() { check_web_vault(); migrations::run_migrations(); + create_icon_cache_folder(); + launch_rocket(); } @@ -129,8 +132,7 @@ fn check_db() { let path = Path::new(&url); if let Some(parent) = path.parent() { - use std::fs; - if fs::create_dir_all(parent).is_err() { + if create_dir_all(parent).is_err() { error!("Error creating database directory"); exit(1); } @@ -148,6 +150,11 @@ fn check_db() { db::get_connection().expect("Can't connect to DB"); } +fn create_icon_cache_folder() { + // Try to create the icon cache folder, and generate an error if it could not. + create_dir_all(&CONFIG.icon_cache_folder()).expect("Error creating icon cache directory"); +} + fn check_rsa_keys() { // If the RSA keys don't exist, try to create them if !util::file_exists(&CONFIG.private_rsa_key()) || !util::file_exists(&CONFIG.public_rsa_key()) {