2018-08-03 11:52:31 +00:00
|
|
|
//! http.rs
|
|
|
|
//!
|
|
|
|
//! A simple wrapper around Hyper's HTTP client.
|
|
|
|
|
2018-01-30 04:53:28 +00:00
|
|
|
use hyper::header::ContentLength;
|
|
|
|
|
|
|
|
use reqwest;
|
|
|
|
|
|
|
|
use std::io::Read;
|
|
|
|
|
2018-08-07 05:34:57 +00:00
|
|
|
/// Downloads a text file from the specified URL.
|
|
|
|
pub fn download_text(url: &str) -> Result<String, String> {
|
|
|
|
// TODO: Decrease check time
|
|
|
|
let mut client = match reqwest::get(url) {
|
|
|
|
Ok(v) => v,
|
|
|
|
Err(v) => return Err(format!("Failed to GET resource: {:?}", v)),
|
|
|
|
};
|
|
|
|
|
|
|
|
client
|
|
|
|
.text()
|
|
|
|
.map_err(|v| format!("Failed to get text from resource: {:?}", v))
|
|
|
|
}
|
|
|
|
|
2018-01-30 04:53:28 +00:00
|
|
|
/// Streams a file from a HTTP server.
|
2018-08-04 08:35:00 +00:00
|
|
|
pub fn stream_file<F>(url: &str, mut callback: F) -> Result<(), String>
|
2018-01-30 04:54:44 +00:00
|
|
|
where
|
2018-08-03 10:45:42 +00:00
|
|
|
F: FnMut(Vec<u8>, u64) -> (),
|
2018-01-30 04:54:44 +00:00
|
|
|
{
|
2018-08-04 13:35:56 +00:00
|
|
|
// TODO: Decrease check time
|
2018-08-04 08:35:00 +00:00
|
|
|
let mut client = match reqwest::get(url) {
|
2018-01-30 04:53:28 +00:00
|
|
|
Ok(v) => v,
|
|
|
|
Err(v) => return Err(format!("Failed to GET resource: {:?}", v)),
|
|
|
|
};
|
|
|
|
|
|
|
|
let size = {
|
2018-01-30 04:54:44 +00:00
|
|
|
let size: Option<&ContentLength> = client.headers().get();
|
2018-01-30 04:53:28 +00:00
|
|
|
match size {
|
|
|
|
Some(&ContentLength(v)) => v,
|
2018-01-30 04:54:44 +00:00
|
|
|
None => 0,
|
2018-01-30 04:53:28 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
let mut buf = [0 as u8; 8192];
|
|
|
|
loop {
|
|
|
|
let len = client.read(&mut buf);
|
|
|
|
let len = match len {
|
|
|
|
Ok(v) => v,
|
2018-01-30 04:54:44 +00:00
|
|
|
Err(v) => return Err(format!("Failed to read resource: {:?}", v)),
|
2018-01-30 04:53:28 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
if len == 0 {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2018-01-30 04:54:44 +00:00
|
|
|
let buf_copy = &buf[0..len];
|
2018-01-30 04:53:28 +00:00
|
|
|
let buf_copy = buf_copy.to_vec();
|
|
|
|
|
|
|
|
callback(buf_copy, size);
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|