aboutsummaryrefslogtreecommitdiffstats
path: root/src/utils.rs
diff options
context:
space:
mode:
authorJokler <jokler.contact@gmail.com>2018-02-13 21:37:58 +0100
committerJokler <jokler.contact@gmail.com>2018-02-13 21:42:26 +0100
commit32e59aa3cc6567b909ab995a4e69beb12bdf0322 (patch)
treeef8fdd610c3062debf8e6cae6bc084cc139c12be /src/utils.rs
parent2c6351d2c8dea5b782b2e6b52b8847426722a60a (diff)
downloadfrippy-32e59aa3cc6567b909ab995a4e69beb12bdf0322.tar.gz
frippy-32e59aa3cc6567b909ab995a4e69beb12bdf0322.zip
Add download function & fromurl command
Diffstat (limited to 'src/utils.rs')
-rw-r--r--src/utils.rs59
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;
+ }
+ }
+}