AnyEvent-HTTP-LWP-UserAgent-Determined
view release on metacpan or search on metacpan
lib/AnyEvent/HTTP/LWP/UserAgent/Determined.pm view on Meta::CPAN
package AnyEvent::HTTP::LWP::UserAgent::Determined;
use strict;
use warnings;
# ABSTRACT: a virtual browser that retries errors with AnyEvent
our $VERSION = 'v0.05.1.06'; # VERSION
use AnyEvent::HTTP::LWP::UserAgent 0.08 ();
use LWP::UserAgent::Determined ();
our (@ISA) = ('AnyEvent::HTTP::LWP::UserAgent', 'LWP::UserAgent::Determined');
#==========================================================================
# extracted from LWP::UserAgent::Determined with little modification
sub simple_request_async {
my($self, @args) = @_;
my(@timing_tries) = ( $self->timing() =~ m<(\d+(?:\.\d+)*)>g );
my $determination = $self->codes_to_determinate();
my $cv = AE::cv;
my $before_c = $self->before_determined_callback;
my $after_c = $self->after_determined_callback;
push @timing_tries, undef;
my $loop;
$loop = sub {
my $pause_if_unsuccessful = shift @timing_tries;
$before_c and $before_c->(
$self, \@timing_tries, $pause_if_unsuccessful, $determination, \@args);
$self->SUPER::simple_request_async(@args)->cb(sub {
my $resp = shift->recv;
$after_c and $after_c->(
$self, \@timing_tries, $pause_if_unsuccessful, $determination, \@args, $resp);
my $code = $resp->code;
unless( $determination->{$code} ) { # normal case: all is well (or 404, etc)
$cv->send($resp); return;
}
if(defined $pause_if_unsuccessful) { # it's undef only on the last
sleep $pause_if_unsuccessful if $pause_if_unsuccessful;
$loop->();
} else {
$cv->send($resp);
}
});
};
$loop->(); # First invoke
return $cv;
}
#--------------------------------------------------------------------------
# extracted from LWP::UserAgent::Determined
sub new {
my $self = shift->SUPER::new(@_);
$self->_determined_init();
return $self;
}
#==========================================================================
1;
__END__
=pod
=head1 NAME
AnyEvent::HTTP::LWP::UserAgent::Determined - a virtual browser that retries errors with AnyEvent
=head1 VERSION
version v0.05.1.06
=head1 SYNOPSIS
use strict;
use AnyEvent::HTTP::LWP::UserAgent::Determined;
my $browser = LWP::UserAgent::Determined->new;
my $response = $browser->get($url, headers... );
$browser->get_async($url, headers... )->cb(sub {
my $response = shift->recv;
});
=head1 DESCRIPTION
L<LWP::UserAgent::Determined> works just like L<LWP::UserAgent> (and is based on it, by
being a subclass of it), except that when you use it to get a web page
but run into a possibly-temporary error (like a DNS lookup timeout),
it'll wait a few seconds and retry a few times.
It also adds some methods for controlling exactly what errors are
considered retry-worthy and how many times to wait and for how many
( run in 1.355 second using v1.01-cache-2.11-cpan-39bf76dae61 )