monger-core 0.14.0

MongoDB version manager
Documentation
use std::io::Read;

use reqwest::blocking::{Client, ClientBuilder, Response};

use crate::error::{Error, Result};

#[derive(Debug)]
pub struct HttpClient {
    client: Client,
}

impl HttpClient {
    pub fn new() -> Result<Self> {
        Ok(Self {
            client: ClientBuilder::new().gzip(false).build()?,
        })
    }

    pub fn get(&self, url: &str) -> Result<Response> {
        let response = self.client.get(url).send()?;
        Ok(response)
    }

    pub fn download_url(&self, url: &str) -> Result<Vec<u8>> {
        println!("downloading {}...", url);
        let mut data = Vec::new();
        let mut response = self.client.get(url).send()?;

        if !response.status().is_success() {
            return Err(Error::InvalidUrl { url: url.into() });
        }

        response.read_to_end(&mut data)?;

        Ok(data)
    }

    pub fn download_version(&self, url: &str, version: &str) -> Result<Vec<u8>> {
        println!("downloading {}...", url);
        let mut data = Vec::new();
        let mut response = self.client.get(url).send()?;

        if !response.status().is_success() {
            return Err(Error::InvalidVersion {
                version: version.into(),
            });
        }

        response.read_to_end(&mut data)?;

        Ok(data)
    }
}

#[cfg(test)]
mod tests {
    use super::HttpClient;

    #[test]
    fn download_test() {
        let client = HttpClient::new().unwrap();
        let data = client
            .download_version("https://httpbin.org/robots.txt", "null")
            .unwrap();
        let expected = "User-agent: *\nDisallow: /deny\n".to_string();

        assert_eq!(expected.into_bytes(), data);
    }
}