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; }});