]> git.proxmox.com Git - proxmox-backup.git/commitdiff
tools: http: add simple general post method
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 27 Oct 2020 08:52:45 +0000 (09:52 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 27 Oct 2020 12:13:00 +0000 (13:13 +0100)
This is intended for when the server needs to do requests on
arbitrary, non PBS, external HTTP resources.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/tools/http.rs

index fe4328065c594ba007b99881a1546d6ad8e3fc4f..168bb10730b603cc2724fa64b3ec186baec024a7 100644 (file)
@@ -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<U: AsRef<str>>(uri: U) -> Result<String, Error> {
-    let res = HTTP_CLIENT.get(uri.as_ref().parse()?).await?;
+pub async fn get_string(uri: &str) -> Result<String, Error> {
+    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<Body>) -> Result<String, Error> {
     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<String>,
+    content_type: Option<&str>,
+) -> Result<Response<Body>, 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,