The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use Yars::Client;
use Mojo::ByteStream qw/b/;

use strict;

my $how_many = $ARGV[0] || 10;

warn "attempting $how_many puts\n";

sub _hex2b64 {
    my $hex = shift or return;
    my $b64 = b(pack 'H*', $hex)->b64_encode;
    local $/="\n";
    chomp $b64;
    return $b64;
}

my $y = Yars::Client->new();
my $ua = Mojo::UserAgent->new();

my $on_file = 1;

sub _newfile {
    my $r = rand 1;
    my $filename = "filename_$r";
    $filename =~ tr/0-9a-zA-Z//dc;
    my $content = "content_$r" x 5000;
    my $md5 = b($content)->md5_sum;
    my $md5_b64 = _hex2b64($md5);
    my $server = $y->_server_for($md5) or die "no server for $md5";
    my $url = Mojo::URL->new($server);
    $url->path("/file/$filename");
    return ( "$url", { Connection => "Close", "Content-MD5" => $md5_b64 }, $content );
}

my $on_finish;
$on_finish = sub {
    my ( $ua, $tx ) = @_;
    my $res = $tx->success or do {
        warn "failed to put :" . $tx->error;
        warn "bailing out";
        Mojo::IOLoop->stop;
    };
    if ( $on_file++ >= $how_many ) {
        warn "done";
        Mojo::IOLoop->stop;
    }
    my ($url,$h,$c) = _newfile();
    warn  "now doing file $on_file : $url" unless $on_file % 100;
    $ua->put($url, $h, $c, $on_finish);
};

for (1..20) {
    $ua->put( _newfile(),  $on_finish );
}

Mojo::IOLoop->start;

1;