api: query_url_metadata: optionally detect compression

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 <p.hufnagl@proxmox.com>

Slightly reworded commit title/message
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>

Reviewed-by: Dominik Csapak <d.csapak@proxmox.com>
Tested-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Philipp Hufnagl 2023-09-21 15:09:16 +02:00 committed by Fabian Grünbichler
parent acaa1e40d6
commit d61728e289

View File

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