Acme-HTTP

 view release on metacpan or  search on metacpan

lib/Acme/HTTP.pm  view on Meta::CPAN

use warnings;

require Exporter;
our @ISA       = qw(Exporter);
our @EXPORT    = qw(
  get_url_act
  get_redir_act
  get_code
  get_message
  get_response

  get_redir_max
  get_timeout

  set_redir_max
  set_timeout
);

our %EXPORT_TAGS = (all => [ @EXPORT ]);

our @EXPORT_OK = qw();

use IO::Select;

our $Url_act   = '';
our $Redir_act = 0;

our $Code      = -1;
our $Message   = '?';
our %Response  = ();

our $Redir_max;
$Redir_max = 3 unless defined $Redir_max;

our $TimeOut;
$TimeOut = 10 unless defined $TimeOut;

sub get_url_act   { $Url_act }
sub get_redir_act { $Redir_act }
sub get_code      { $Code }
sub get_message   { $Message }
sub get_response  { \%Response }

sub get_redir_max { $Redir_max }
sub get_timeout   { $TimeOut }

sub set_redir_max { $Redir_max = $_[0] }
sub set_timeout   { $TimeOut   = $_[0] }

sub new {
    shift;
    my ($url) = @_;
    my $hdl;

    $Url_act = '';
    $Redir_act = 0;

    while (defined $url) {
        $Redir_act++;
        if ($Redir_act > $Redir_max) {
            $@ = 'Acme::HTTP - Runaway iterations ('.$Redir_max.')';
            return;
        }

        $Url_act = $url;

        my ($type, $host, $get) =
          $Url_act =~ m{\A ([^:]+) : // ([^/]+)        \z}xms ? ($1, $2, '/') :
          $Url_act =~ m{\A ([^:]+) : // ([^/]+) (/ .*) \z}xms ? ($1, $2, $3)  :
          do {
            $@ = 'Acme::HTTP - Invalid structure)';
            return;
          };

        my $net_http =
          $type eq 'http'  ? 'Net::HTTP::NB'  :
          $type eq 'https' ? 'Net::HTTPS::NB' :
          do { 
            $@ = 'Acme::HTTP - Can\'t identify type';
            return;
          };

        if ($net_http eq 'Net::HTTP::NB') {
            require Net::HTTP::NB;
        }
        elsif ($net_http eq 'Net::HTTPS::NB') {
            require Net::HTTPS::NB;
        }
        else {
            $@ = 'Acme::HTTP - Internal error net_http = \''.$net_http.'\'';
            return;
        }

        $hdl = $net_http->new(Host => $host) or do {
            $@ = 'Acme::HTTP - Can\'t Net::HTTP(S)->new(Host =>...)';
            return;
        };

        $hdl->write_request(GET => $get, 'User-Agent' => 'Mozilla/5.0');

        use IO::Select;
        my $sel = IO::Select->new($hdl);
 
        READ_HEADER: {
            unless ($sel->can_read($TimeOut)) {
                $@ = 'Acme::HTTP - Header timeout('.$TimeOut.')';
                return;
            }

            ($Code, $Message, %Response) = $hdl->read_response_headers;

            redo READ_HEADER unless $Code;
        }

        $url = $Response{'Location'};
    }

    unless (defined $hdl) {
        $@ = 'Acme::HTTP - Internal error, hdl is undefined';
        return;
    }



( run in 0.484 second using v1.01-cache-2.11-cpan-96521ef73a4 )