diff --git a/Cargo.toml b/Cargo.toml index 3bcdb22..f860002 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,10 +7,7 @@ authors = ["Smart SangGe "] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -<<<<<<< HEAD clap = "2.33.2" indicatif = "0.15" console = "0.14" -======= -clap = "2.26.0" ->>>>>>> parent of 4ca1b62 (feat: finish all func) +reqwest = { version = "0.11", features = ["blocking"] } diff --git a/src/main.rs b/src/main.rs index f90f860..6ac5272 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,19 +1,19 @@ extern crate clap; -<<<<<<< HEAD extern crate indicatif; extern crate console; use clap::{Arg, App}; use indicatif::{ProgressBar, ProgressStyle, HumanBytes}; use console::style; +use std::io::Read; +use reqwest::header::{CONTENT_LENGTH, CONTENT_TYPE}; use std::fs::File; use std::io::{self, Write}; +use reqwest::blocking::Client; + -======= -use clap::{Arg, App}; ->>>>>>> parent of 4ca1b62 (feat: finish all func) fn main() { let matches = App::new("Rget") @@ -26,8 +26,12 @@ fn main() { .index(1) .help("url to download")) .get_matches(); + let url = matches.value_of("URL").unwrap(); - println!("{}", url); + + if let Err(e) = download(url, false) { + eprintln!("Download error: {}", e); + } } fn create_progress_bar(quiet_mode: bool, msg: &str, length: Option) -> ProgressBar { @@ -53,41 +57,54 @@ fn create_progress_bar(quiet_mode: bool, msg: &str, length: Option) -> Prog bar } -fn download(target: &str, quiet_mode: bool) -> Result<(), Box<::std::error::Error>> { +fn download(target: &str, quiet_mode: bool) -> Result<(), Box> { // parse url let url = parse_url(target)?; - let client = Client::new().unwrap(); - let mut resp = client.get(url)? - .send() - .unwrap(); - print(format!("HTTP request sent... {}", - style(format!("{}", resp.status())).green()), - quiet_mode); + let client = reqwest::blocking::Client::new(); + let mut resp = client.get(url).send()?; + + + + if !quiet_mode { + println!("HTTP request sent... {}", style(resp.status()).green()); + } + if resp.status().is_success() { - let headers = resp.headers().clone(); - let ct_len = headers.get::().map(|ct_len| **ct_len); + let headers = resp.headers(); - let ct_type = headers.get::().unwrap(); + let ct_len = resp.headers().get(CONTENT_LENGTH) + .and_then(|ct_len| ct_len.to_str().ok()) + .and_then(|ct_len_str| ct_len_str.parse::().ok()); + + let ct_type = resp.headers().get(CONTENT_TYPE) + .and_then(|ct_type| ct_type.to_str().ok()); match ct_len { Some(len) => { - print(format!("Length: {} ({})", - style(len).green(), - style(format!("{}", HumanBytes(len))).red()), - quiet_mode); + if !quiet_mode { + println!("Length: {} ({})", + style(len).green(), + style(HumanBytes(len)).red()); + } }, None => { - print(format!("Length: {}", style("unknown").red()), quiet_mode); + if !quiet_mode { + println!("Length: {}", style("unknown").red()); + } }, } - print(format!("Type: {}", style(ct_type).green()), quiet_mode); + // Print content type + custom_print(format!("Type: {}", style(ct_type).green()), quiet_mode); + // Get the filename from the URL let fname = target.split("/").last().unwrap(); - print(format!("Saving to: {}", style(fname).green()), quiet_mode); + // Print saving message + custom_print(format!("Saving to: {}", style(fname).green()), quiet_mode); + let chunk_size = match ct_len { Some(x) => x as usize / 99, @@ -120,4 +137,17 @@ fn download(target: &str, quiet_mode: bool) -> Result<(), Box<::std::error::Erro Ok(()) -} \ No newline at end of file +} + +fn save_to_file(data: &[u8], filename: &str) -> io::Result<()> { + let mut file = File::create(filename)?; + file.write_all(data)?; + Ok(()) +} + +fn custom_print(message: String, quiet_mode: bool) { + if !quiet_mode { + println!("{}", message); + } +} +