From 9a7c35436cf51ce435d54c31c995b95b827933b4 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Mon, 20 May 2019 12:49:24 -0300 Subject: [PATCH] Saving attachments to disk too! --- Cargo.lock | 1 - Cargo.toml | 1 - src/main.rs | 33 +++++++++++++++++++++++---------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f051bc..304123a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -277,7 +277,6 @@ dependencies = [ "elefren 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "html2md 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.28 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.9.17 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/Cargo.toml b/Cargo.toml index 1ac9b4f..567ba24 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,5 @@ edition = "2018" elefren = { version = "0.19", features = ["toml"] } html2md = "0.2.9" reqwest = "0.9.17" -hyper = "*" log = "0.4.6" env_logger = "0.6.1" diff --git a/src/main.rs b/src/main.rs index 6fe896d..d1171ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,8 +11,6 @@ use elefren::prelude::*; use reqwest; -use hyper::Uri; - use log; use env_logger; @@ -76,14 +74,29 @@ fn save_attachments(record: &Status) -> () { fn save_attachment(attachment: &Attachment, base_path: &PathBuf) -> () { log::debug!("Saving attachment {}", attachment.url); - let uri: Uri = attachment.url.parse().expect("Invalid URL"); - let body = reqwest::get(&attachment.url) - .expect("Failed to connect to server") - .text() - .expect("Failed to retrieve attachment"); + let filename = base_path.join(get_attachment_filename(&attachment.url)); + log::debug!("Saving attachment to {:?}", filename); + if let Ok(mut fp) = File::create(filename) { + reqwest::get(&attachment.url) + .expect("Failed to connect to server") + .copy_to(&mut fp) + .expect("Failed to save attachment"); + } +} - if let Ok(mut fp) = File::create(base_path.join(uri.path())) { - fp.write_all(body.as_bytes()) - .expect("Failed to save the attachment"); +fn get_attachment_filename(url: &str) -> String { + let mut frags = url.rsplitn(2, '/'); + log::debug!("URL fragments: {:?}", frags); + if let Some(path_part) = frags.next() { + log::debug!("Found path in the attachment URL: {:?}", path_part); + path_part + .split('?') + .next() + .unwrap_or(url) + .to_string() + } else { + // this is, most of the time, bad (due special characters -- like '?' -- and path) + log::debug!("No path in attachment, using full URL"); + url.to_string() } }