]> git.proxmox.com Git - pve-xtermjs.git/commitdiff
switch from curl to ureq
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 26 Jan 2022 17:58:29 +0000 (18:58 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Fri, 28 Jan 2022 08:18:00 +0000 (09:18 +0100)
Not only less code, we lose a whopping 29 libraries on linkage cruft:

> --- ldd.before  2022-01-26 19:03:25.759426164 +0100
> +++ ldd.after   2022-01-26 19:03:31.919529632 +0100
> @@ -5,36 +5,7 @@ librt.so.1
>  libzstd.so.1
>  libc.so.6
>  /lib64/ld-linux-x86-64.so.2
> -libcurl-gnutls.so.4
>  libgcc_s.so.1
>  libpthread.so.0
>  libm.so.6
>  libdl.so.2
> -libnghttp2.so.14
> -libidn2.so.0
> -librtmp.so.1
> -libssh2.so.1
> -libpsl.so.5
> -libnettle.so.8
> -libgnutls.so.30
> -libgssapi_krb5.so.2
> -libldap_r-2.4.so.2
> -liblber-2.4.so.2
> -libbrotlidec.so.1
> -libz.so.1
> -libunistring.so.2
> -libhogweed.so.6
> -libgmp.so.10
> -libgcrypt.so.20
> -libp11-kit.so.0
> -libtasn1.so.6
> -libkrb5.so.3
> -libk5crypto.so.3
> -libcom_err.so.2
> -libkrb5support.so.0
> -libresolv.so.2
> -libsasl2.so.2
> -libbrotlicommon.so.1
> -libgpg-error.so.0
> -libffi.so.7
> -libkeyutils.so.1

IOW.: curl is really nice for a CLI tool and super powerful library,
but way to much overkill for simple HTTP requests (not even TLS) we
need here.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Cargo.toml
src/main.rs

index 25c4569ee01109c166cbdec22da18422226ba516..95ff1d16e76b0b80adbddf96e524c53e8832e554 100644 (file)
@@ -13,7 +13,7 @@ exclude = [ "build", "debian" ]
 [dependencies]
 anyhow = "1"
 mio = { version = "0.7", features = [ "net", "os-ext" ] }
-curl = "0.4"
+ureq = { version = "2.4", default-features = false, features = [ "gzip" ] }
 clap = "2.33"
 proxmox-io = "1"
 proxmox-sys = "0.2"
index 0003834f35b6023e763bd8518c7273e4ffc3757c..16150c5dfab7702eec49fdbd5c5c5ff6e22d700c 100644 (file)
@@ -9,7 +9,6 @@ use std::time::{Duration, Instant};
 
 use anyhow::{bail, format_err, Result};
 use clap::{App, AppSettings, Arg};
-use curl::easy::Easy;
 use mio::net::{TcpListener, TcpStream};
 use mio::unix::SourceFd;
 use mio::{Events, Interest, Poll, Token};
@@ -152,41 +151,29 @@ fn authenticate(
     authport: u16,
     port: Option<u16>,
 ) -> Result<()> {
-    let mut curl = Easy::new();
-    curl.url(&format!(
-        "http://localhost:{}/api2/json/access/ticket",
-        authport
-    ))?;
-
-    let username = curl.url_encode(username);
-    let ticket = curl.url_encode(ticket);
-    let path = curl.url_encode(path.as_bytes());
-
-    let mut post_fields = Vec::with_capacity(5);
-    post_fields.push(format!("username={}", username));
-    post_fields.push(format!("password={}", ticket));
-    post_fields.push(format!("path={}", path));
-
+    let mut post_fields: Vec<(&str, &str)> = Vec::with_capacity(5);
+    post_fields.push(("username", std::str::from_utf8(username)?));
+    post_fields.push(("password", std::str::from_utf8(ticket)?));
+    post_fields.push(("path", path));
     if let Some(perm) = perm {
-        let perm = curl.url_encode(perm.as_bytes());
-        post_fields.push(format!("privs={}", perm));
+        post_fields.push(("privs", perm));
     }
-
+    let port_str;
     if let Some(port) = port {
-        post_fields.push(format!("port={}", port));
+        port_str = port.to_string();
+        post_fields.push(("port", &port_str));
     }
 
-    curl.post_fields_copy(post_fields.join("&").as_bytes())?;
-    curl.post(true)?;
-    curl.perform()?;
+    let url = format!("http://localhost:{}/api2/json/access/ticket", authport);
 
-    let response_code = curl.response_code()?;
-
-    if response_code != 200 {
-        bail!("invalid authentication, code {}", response_code);
+    match ureq::post(&url).send_form(&post_fields[..]) {
+        Ok(res) if res.status() == 200 => Ok(()),
+        Ok(res) | Err(ureq::Error::Status(_, res)) => {
+            let code = res.status();
+            bail!("invalid authentication - {} {}", code, res.status_text())
+        }
+        Err(err) => bail!("authentication request failed - {}", err),
     }
-
-    Ok(())
 }
 
 fn listen_and_accept(