From d61728e289c82c7ce35a03b5b6b3da45ae177c5c Mon Sep 17 00:00:00 2001
From: Philipp Hufnagl
Date: Thu, 21 Sep 2023 15:09:16 +0200
Subject: [PATCH] api: query_url_metadata: optionally detect compression
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
extend the query_url_metadata endpoint with the option to detect and return
used compression algorithms, if supported by PVE. this will be used to support
decompression as part of the download flow for certain file types (ISO files
for now).
Signed-off-by: Philipp Hufnagl
Slightly reworded commit title/message
Signed-off-by: Fabian Grünbichler
Reviewed-by: Dominik Csapak
Tested-by: Dominik Csapak
---
PVE/API2/Nodes.pm | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 5a148d1d..1e8ed09e 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -34,6 +34,7 @@ use PVE::RRD;
use PVE::Report;
use PVE::SafeSyslog;
use PVE::Storage;
+use PVE::Storage::Plugin;
use PVE::Tools;
use PVE::pvecfg;
@@ -1564,7 +1565,13 @@ __PACKAGE__->register_method({
type => 'boolean',
optional => 1,
default => 1,
- }
+ },
+ 'detect-compression' => {
+ description => "If true an auto detection of used compression will be attempted",
+ type => 'boolean',
+ optional => 1,
+ default => 0,
+ },
},
},
returns => {
@@ -1583,6 +1590,11 @@ __PACKAGE__->register_method({
type => 'string',
optional => 1,
},
+ compression => {
+ type => 'string',
+ enum => $PVE::Storage::Plugin::KNOWN_COMPRESSION_FORMATS,
+ optional => 1,
+ },
},
},
code => sub {
@@ -1605,6 +1617,7 @@ __PACKAGE__->register_method({
SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE,
);
}
+ my $detect_compression = $param->{'detect-compression'} // 0;
my $req = HTTP::Request->new(HEAD => $url);
my $res = $ua->request($req);
@@ -1615,6 +1628,7 @@ __PACKAGE__->register_method({
my $disposition = $res->header("Content-Disposition");
my $type = $res->header("Content-Type");
+ my $compression;
my $filename;
if ($disposition && ($disposition =~ m/filename="([^"]*)"/ || $disposition =~ m/filename=([^;]*)/)) {
@@ -1628,10 +1642,16 @@ __PACKAGE__->register_method({
$type = $1;
}
+ if ($detect_compression && $filename =~ m!^(.+)\.(${\PVE::Storage::Plugin::COMPRESSOR_RE})$!) {
+ $filename = $1;
+ $compression = $2;
+ }
+
my $ret = {};
$ret->{filename} = $filename if $filename;
$ret->{size} = $size + 0 if $size;
$ret->{mimetype} = $type if $type;
+ $ret->{compression} = $compression if $compression;
return $ret;
}});