App-MBUtiny

 view release on metacpan or  search on metacpan

lib/App/MBUtiny/Storage/HTTP.pm  view on Meta::CPAN

                $self->error(join("\n", $client->transaction, $client->error));
                $ostat = 0;
            }
            my $dst_size = $info{size} || 0;
            unless ($src_size == $dst_size) {
                $self->error(sprintf("An error occurred while sending data to %s. Sizes are different: SRC=%d; DST=%d", $url_wop, $src_size, $dst_size));
                $ostat = 0;
            }
        }

        # Fixup!
        $self->fixup("put", $ostat, $comment) if $storage->{fixup};
        $status = 0 unless $ostat;
    }

    $self->storage_status(STORAGE_SIGN, 0) unless $status;
}
sub get {
    my $self = shift;
    my %params = @_;
    if ($self->storage_status(STORAGE_SIGN) <= 0) { # SKIP and set SKIP
        $self->maybe::next::method(%params);
        return $self->storage_status(STORAGE_SIGN, -1);
    }
    my $name = $params{name}; # archive name
    my $file = $params{file}; # destination archive file path

    foreach my $storage ($self->http_storages) {
        my $url = $storage->{url};
        my $url_wop = $storage->{url_wop};
        my $attr = $storage->{attr};

        # Create object
        my $client = new App::MBUtiny::Storage::HTTP::Client(
            url     => $url, # Base URL
            timeout => $storage->{timeout}, # default: 180
            ($attr && isnt_void($attr)) ? (headers => $attr) : (),
            no_check_redirect => 0,
        );
        unless ($client->status) {
            $self->error(sprintf("Can't connect to %s: %s", $url_wop, $client->error));
            next;
        }

        # Download file
        $client->download(file => $file, name => $name) or do {
            $self->error(join("\n", $client->transaction, $client->error));
            next;
        };
        my $src_size = 0;
        if (my $res = $client->res) {
            $src_size = $res->content_length || 0
        }
        my $dst_size = filesize($file) // 0;
        unless ($src_size == $dst_size) {
            $self->error(sprintf("An error occurred while fetching data from %s. Sizes are different: SRC=%d; DST=%d", $url_wop, $src_size, $dst_size));
            next;
        }

        # Validate
        unless ($self->validate($file)) { # FAIL validation!
            $self->error(sprintf("HTTP storage %s failed: file %s is not valid!", $url_wop, $file));
            next
        }

        # Done!
        return $self->storage_status(STORAGE_SIGN, 1);
    }

    $self->storage_status(STORAGE_SIGN, 0);
    $self->maybe::next::method(%params);
}
sub del {
    my $self = shift;
    my $name = shift;
    $self->maybe::next::method($name);
    return $self->storage_status(STORAGE_SIGN, -1) if $self->storage_status(STORAGE_SIGN) <= 0; # SKIP and set SKIP
    my $status = 1;

    foreach my $storage ($self->http_storages) {
        my $url = $storage->{url};
        my $url_wop = $storage->{url_wop};
        my $attr = $storage->{attr};
        my $ostat = 1;

        # Create object
        my $client = new App::MBUtiny::Storage::HTTP::Client(
            url     => $url, # Base URL
            timeout => $storage->{timeout}, # default: 180
            ($attr && isnt_void($attr)) ? (headers => $attr) : (),
        );
        unless ($client->status) {
            $self->error(sprintf("Can't connect to %s: %s", $url_wop, $client->error));
            $ostat = 0;
        }

        # Get list
        my @ls = ();
        if ($ostat) {
            @ls = $client->filelist(host => $self->{name});
            unless ($client->status) {
                $self->error(join("\n", $client->transaction, $client->error));
                $ostat = 0;
            }
        }

        # Delete file
        if ($ostat && grep { $_ eq $name } @ls ) {
            $client->remove(name => $name) or do {
                $self->error(join("\n", $client->transaction, $client->error));
                $ostat = 0;
            };
        }

        # Fixup!
        $self->fixup("del", $name) if $storage->{fixup};
        $status = 0 unless $ostat;
    }
    $self->storage_status(STORAGE_SIGN, 0) unless $status;
}
sub list {



( run in 0.784 second using v1.01-cache-2.11-cpan-39bf76dae61 )