From 597641fdd51ccdbd914e4de978ecc0a457bb49bd Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 17 Jan 2019 11:29:38 +0100 Subject: [PATCH] client/http_client.rs: new helper class --- src/client/http_client.rs | 65 +++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 66 insertions(+) create mode 100644 src/client/http_client.rs diff --git a/src/client/http_client.rs b/src/client/http_client.rs new file mode 100644 index 00000000..18cca325 --- /dev/null +++ b/src/client/http_client.rs @@ -0,0 +1,65 @@ +use failure::*; + +use http::Uri; +use hyper::Body; +use hyper::client::Client; +use hyper::rt::{self, Future}; + +pub struct HttpClient { + server: String, +} + +impl HttpClient { + + pub fn new(server: &str) -> Self { + Self { + server: String::from(server), + } + } + + pub fn upload(&self, body: Body, path: &str) -> Result<(), Error> { + + let client = Client::new(); + + let url: Uri = format!("http://{}:8007/{}", self.server, path).parse()?; + + use http::Request; + use futures::stream::Stream; + + let request = Request::builder() + .method("POST") + .uri(url) + .header("User-Agent", "proxmox-backup-client/1.0") + .body(body)?; + + let future = client + .request(request) + .map_err(|e| Error::from(e)) + .and_then(|resp| { + + let status = resp.status(); + + resp.into_body().concat2().map_err(|e| Error::from(e)) + .and_then(move |data| { + + let text = String::from_utf8(data.to_vec()).unwrap(); + if status.is_success() { + println!("Result {} {}", status, text); + } else { + eprintln!("HTTP Error {}: {}", status, text); + } + Ok(()) + }) + }) + .map_err(|err| { + eprintln!("Error: {}", err); + }); + + // drop client, else client keeps connectioon open (keep-alive feature) + drop(client); + + rt::run(future); + + Ok(()) + } +} diff --git a/src/lib.rs b/src/lib.rs index 725d8e7a..017fa843 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -59,5 +59,6 @@ pub mod api3; pub mod client { + pub mod http_client; pub mod catar_backup_stream; }