diff options
| author | Jokler <jokler.contact@gmail.com> | 2018-02-13 21:37:58 +0100 |
|---|---|---|
| committer | Jokler <jokler.contact@gmail.com> | 2018-02-13 21:42:26 +0100 |
| commit | 32e59aa3cc6567b909ab995a4e69beb12bdf0322 (patch) | |
| tree | ef8fdd610c3062debf8e6cae6bc084cc139c12be /src/utils.rs | |
| parent | 2c6351d2c8dea5b782b2e6b52b8847426722a60a (diff) | |
| download | frippy-32e59aa3cc6567b909ab995a4e69beb12bdf0322.tar.gz frippy-32e59aa3cc6567b909ab995a4e69beb12bdf0322.zip | |
Add download function & fromurl command
Diffstat (limited to 'src/utils.rs')
| -rw-r--r-- | src/utils.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..59a5a54 --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,59 @@ +extern crate reqwest; + +use std::str; +use std::io::{self, Read}; + +use self::reqwest::Client; +use self::reqwest::header::Connection; + +pub fn download(max_kib: usize, url: &str) -> Option<String> { + let response = Client::new() + .get(url) + .header(Connection::close()) + .send(); + + match response { + Ok(mut response) => { + let mut body = String::new(); + + // 500 kilobyte buffer + let mut buf = [0; 500 * 1000]; + let mut written = 0; + // Read until we reach EOF or max_kib KiB + loop { + let len = match response.read(&mut buf) { + Ok(0) => break, + Ok(len) => len, + Err(ref e) if e.kind() == io::ErrorKind::Interrupted => continue, + Err(e) => { + debug!("Download from {:?} failed: {}", url, e); + return None; + } + }; + + let slice = match str::from_utf8(&buf[..len]) { + Ok(slice) => slice, + Err(e) => { + debug!("Failed to read bytes from {:?} as UTF8: {}", url, e); + return None; + } + }; + + body.push_str(slice); + written += len; + + // Check if the file is too large to download + if written > max_kib * 1024 { + debug!("Stopping download - File from {:?} is larger than {} KiB", url, max_kib); + return None; + } + + } + Some(body) + } + Err(e) => { + debug!("Bad response from {:?}: ({})", url, e); + return None; + } + } +} |
