]> git.proxmox.com Git - pve-manager.git/commitdiff
api: query_url_metadata: optionally detect compression
authorPhilipp Hufnagl <p.hufnagl@proxmox.com>
Thu, 21 Sep 2023 13:09:16 +0000 (15:09 +0200)
committerFabian Grünbichler <f.gruenbichler@proxmox.com>
Tue, 26 Sep 2023 07:28:09 +0000 (09:28 +0200)
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>
PVE/API2/Nodes.pm

index 5a148d1d08ca743e97b83896611cf481d22e80d0..1e8ed09e09a270210d3cfdd565b1a56496439849 100644 (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;
     }});