From 2e201e7da69cfb73d764e6c057eb0c7fcd0a40e2 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Tue, 27 Oct 2020 09:52:45 +0100 Subject: [PATCH] tools: http: add simple general post method This is intended for when the server needs to do requests on arbitrary, non PBS, external HTTP resources. Signed-off-by: Thomas Lamprecht --- src/tools/http.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/tools/http.rs b/src/tools/http.rs index fe432806..168bb107 100644 --- a/src/tools/http.rs +++ b/src/tools/http.rs @@ -5,6 +5,7 @@ use std::os::unix::io::AsRawFd; use hyper::{Uri, Body}; use hyper::client::{Client, HttpConnector}; +use http::{Request, Response}; use openssl::ssl::{SslConnector, SslMethod}; use futures::*; @@ -25,19 +26,48 @@ lazy_static! { }; } -pub async fn get_string>(uri: U) -> Result { - let res = HTTP_CLIENT.get(uri.as_ref().parse()?).await?; +pub async fn get_string(uri: &str) -> Result { + let res = HTTP_CLIENT.get(uri.parse()?).await?; let status = res.status(); if !status.is_success() { bail!("Got bad status '{}' from server", status) } + response_body_string(res).await +} + +pub async fn response_body_string(res: Response) -> Result { let buf = hyper::body::to_bytes(res).await?; String::from_utf8(buf.to_vec()) .map_err(|err| format_err!("Error converting HTTP result data: {}", err)) } +pub async fn post( + uri: &str, + body: Option, + content_type: Option<&str>, +) -> Result, Error> { + let body = if let Some(body) = body { + Body::from(body) + } else { + Body::empty() + }; + let content_type = content_type.unwrap_or("application/json"); + + let request = Request::builder() + .method("POST") + .uri(uri) + .header("User-Agent", "proxmox-backup-client/1.0") + .header(hyper::header::CONTENT_TYPE, content_type) + .body(body)?; + + + HTTP_CLIENT.request(request) + .map_err(Error::from) + .await +} + #[derive(Clone)] pub struct HttpsConnector { http: HttpConnector,