AnyEvent-HTTP

 view release on metacpan or  search on metacpan

README  view on Meta::CPAN

                   truncate $fh, $ofs = 0;
                }

                sysseek $fh, $ofs, 0;

                1
             },
             on_body   => sub {
                my ($data, $hdr) = @_;

                if ($hdr->{Status} =~ /^2/) {
                   length $data == syswrite $fh, $data
                      or return; # abort on write errors
                }

                1
             },
             sub {
                my (undef, $hdr) = @_;

                my $status = $hdr->{Status};

                if (my $time = AnyEvent::HTTP::parse_date $hdr->{"last-modified"}) {
                   utime $time, $time, $fh;
                }

                if ($status == 200 || $status == 206 || $status == 416) {
                   # download ok || resume ok || file already fully downloaded
                   $cb->(1, $hdr);

                } elsif ($status == 412) {
                   # file has changed while resuming, delete and retry
                   unlink $file;
                   $cb->(0, $hdr);

                } elsif ($status == 500 or $status == 503 or $status =~ /^59/) {
                   # retry later
                   $cb->(0, $hdr);

                } else {
                   $cb->(undef, $hdr);
                }
             }
          ;
       }

       download "http://server/somelargefile", "/tmp/somelargefile", sub {
          if ($_[0]) {
             print "OK!\n";
          } elsif (defined $_[0]) {
             print "please retry later\n";
          } else {
             print "ERROR\n";
          }
       };

   SOCKS PROXIES
    Socks proxies are not directly supported by AnyEvent::HTTP. You can
    compile your perl to support socks, or use an external program such as
    socksify (dante) or tsocks to make your program use a socks proxy
    transparently.

    Alternatively, for AnyEvent::HTTP only, you can use your own
    "tcp_connect" function that does the proxy handshake - here is an
    example that works with socks4a proxies:

       use Errno;
       use AnyEvent::Util;
       use AnyEvent::Socket;
       use AnyEvent::Handle;

       # host, port and username of/for your socks4a proxy
       my $socks_host = "10.0.0.23";
       my $socks_port = 9050;
       my $socks_user = "";

       sub socks4a_connect {
          my ($host, $port, $connect_cb, $prepare_cb) = @_;

          my $hdl = new AnyEvent::Handle
             connect    => [$socks_host, $socks_port],
             on_prepare => sub { $prepare_cb->($_[0]{fh}) },
             on_error   => sub { $connect_cb->() },
          ;

          $hdl->push_write (pack "CCnNZ*Z*", 4, 1, $port, 1, $socks_user, $host);

          $hdl->push_read (chunk => 8, sub {
             my ($hdl, $chunk) = @_;
             my ($status, $port, $ipn) = unpack "xCna4", $chunk;

             if ($status == 0x5a) {
                $connect_cb->($hdl->{fh}, (format_address $ipn) . ":$port");
             } else {
                $! = Errno::ENXIO; $connect_cb->();
             }
          });

          $hdl
       }

    Use "socks4a_connect" instead of "tcp_connect" when doing
    "http_request"s, possibly after switching off other proxy types:

       AnyEvent::HTTP::set_proxy undef; # usually you do not want other proxies

       http_get 'http://www.google.com', tcp_connect => \&socks4a_connect, sub {
          my ($data, $headers) = @_;
          ...
       };

SEE ALSO
    AnyEvent.

AUTHOR
       Marc Lehmann <schmorp@schmorp.de>
       http://home.schmorp.de/

    With many thanks to Дмитрий Шалашов, who provided countless testcases
    and bugreports.



( run in 1.730 second using v1.01-cache-2.11-cpan-e1769b4cff6 )