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 )