2012-04-10 2 views
2

는 해당 옵션 (Range, :content_file, :content_cb, size_hint)을 설정할 수있는 가능성을 가진, Mojo::UserAgent으로 다음처럼 작성할 수있는 방법이 있나요.모조 :: 해당 UserAgent 얻을() - 정의 콜백

#!/usr/bin/env perl 
use warnings; 
use 5.12.0; 
use LWP::UserAgent; 
use File::Basename; 

my $url = 'ftp://ftp.vim.org/pub/vim/runtime/spell/en.utf-8.spl'; 
my $file = basename $url; 
my $ua = LWP::UserAgent->new(); 
my $bytes = 0; 

open my $fh, '>>:raw', $file or die $!; 
my $res = $ua->get( 
    $url, 
    'Range' => "bytes=$bytes-", 
    ':content_cb' => sub { 
     my ($chunk, $res, $proto) = @_; 
     print $fh $chunk; 
     state $old_size = 0; 
     my $size = tell $fh; 
     my $total; 
     say 'chunk size :', $size - $old_size; 
     if ($total = $res->header('Content-Length')) { 
      say 'total size : ', $total; 
      say 'downloaded : ', $size; 
      say 'remaining : ', $total - $size; 
     } 
     say ""; 
     $old_size = $size; 
    } 
); 
close $fh; 

say $res->status_line; 
+0

당신의 목표는 무엇인가? 왜 작업 프로그램에서'LWP'를'Mojo :: UserAgent'로 바꾸고 싶습니까? – Borodin

+0

일부 스크립트에서는 Mojolicious를 사용하고 있습니다. 그래서 언젠가 이런 식으로 뭔가가 필요하다면 이미 해결책을 얻었을 것입니다. –

답변

3
#!/usr/bin/env perl 

use 5.12.0; 
use warnings; 

use File::Basename qw(basename); 
use Mojo::UserAgent(); 

my $url = 'ftp://ftp.vim.org/pub/vim/runtime/spell/en.utf-8.spl'; 
my $ua = Mojo::UserAgent->new(); 
my $tx = $ua->build_tx(GET => $url); 

open(my $fh, '>:raw', basename($url)) or die($!); 
$tx->req->headers->header(range => 'bytes=0-'); 
$tx->res->content->on(read => sub { 
    print($fh $_[1]); 
    say('chunk size: ', length($_[1])); 
    say('total size: ', $_[0]->headers->content_length); 
    say('downloaded: ', $_[0]->body_size); 
    say(''); 
}); 
$ua->start($tx); 
close($fh); 

say($tx->res->code, ' ', $tx->res->message); 
관련 문제