HTTP::Tinyでプログレスバーを表示

Furlの FAQのものと同じですが。

#!perl
use strict;
use warnings;

use HTTP::Tiny;
use Term::ProgressBar;
use File::Basename;

my $url = shift or die "Usage $0 url";

my $ua = HTTP::Tiny->new(
    agent => 'sample ua',
);

my $bar = Term::ProgressBar->new({
    count => 1024, ETA => 'linear',
});

$bar->minor(0);
$bar->max_update_rate(1);

my $did_set_target = 0;
my $received_size = 0;
my $next_update = 0;
my $content = '';
my $res = $ua->request('GET', $url, {
    data_callback => sub {
        my ($buf, $res) = @_;

        unless ($did_set_target) {
            if ( my $cl = $res->{headers}->{'content-length'}) {
                $bar->target($cl);
                $did_set_target++;
            } else {
                $bar->target( $received_size + 2 * length($buf));
            }
        }

        $received_size += length($buf);
        $content .= $buf;
        if ($received_size >= $next_update) {
            $next_update = $bar->update($received_size)
        }
    },
});

open my $fh, '>', basename($url) or die "Can't open file\n";
print $fh $content;
close $fh;