#!/usr/bin/perl -WT

use Getopt::Long;
use strict;

my $veces      = 0;
my $ShowHeader = "";
my $deftarget  = "http://localhost/";
my $target     = "";
my %tGlobal;

$tGlobal{"inicio"} = scalar(gmtime());
$tGlobal{"test"}   = 0;
$tGlobal{"error"}  = 0;

my $Header = "Soy un navegador compatible, no me discriminen";
###
# Otro Header posible (pero que lo detectaría como un Opera/IE) sería:
#  "Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i386) Opera 7.23 [en]"
# (sin las comillas)
##

my $help   = 0;
my $result = GetOptions(
    "veces=i"    => \$veces,
    "showheader" => \$ShowHeader,
    "target=s"   => \$target,
    "help"       => \$help
);

if (   ( $target =~ m/(http(s)?|ftp|gopher)?(\:\/\/){1}(\w)+?\.(\w)+?/ )
    || ( $target =~ m/(http(s)?|ftp|gopher)?(\:\/\/){1}(\w)+?/ ) )
{
    print "Mi objetivo ser\xe1: '" . $target . "'\n\n";
    $deftarget = $target;
}
else {
    usage();
    exit 1;
}

if ( $help || ( $veces < 1 ) ) {
    usage();
    exit 2;
}
else {
    for my $paso ( 1 .. $veces ) {
        $tGlobal{'test'} = prueba( $ShowHeader, $paso , $tGlobal{"test"});
    }
}

$tGlobal{"fin"} = scalar(gmtime());

print <<EOM;

 Inicio:  $tGlobal{"inicio"}
 Fin:     $tGlobal{"fin"}
 Lapsus:  $tGlobal{"test"}  (segundos)
 Errores: $tGlobal{"error"}

EOM


sub usage {
    print STDERR <<EOM;

 Modo de uso:
  $0 <(--target|-t) proto+dominio> <(--veces|-v) N> [(--showheader|-s)]

  Lo marcado entre "<" y ">" es obligatorio.
  Lo marcado entre "[" y "]" es optativo.

   -v N donde N son las veces que se quiere que se repita
         (debe ser mayor que uno)
   -s   Muestra los encabezados recibidos por cada pedido
         (si todo marcha bien, deber\xeda ser siempre 200,
         hasta que el servidor se "fatigue", donde pasar\xe1 a ser 500)
   -t   Define el target contra el cual se intentar\xe1 conectar
          este script (debe ser en la forma de protocolo + dominio).
          Un ejemplo: http://localhost

EOM
}

sub prueba {
    my $flag = $_[0];
    my $c    = $_[1];
    my $t    = $_[2];

    use LWP::UserAgent;

    my @tmp = gmtime();
    my $iniTime = $tmp[0] + ($tmp[1] * 60) + ($tmp[2] * 3600);
    my $ua = LWP::UserAgent->new;
    $ua->agent($Header);
    my $req = HTTP::Request->new( GET => $deftarget );
    my $res = $ua->request($req);

    @tmp = gmtime();
    my $time = ($tmp[0] + ($tmp[1] * 60) + ($tmp[2] * 3600)) - $iniTime;

    if($res->status_line =~ m/(200|3..)/){
        print $res->status_line, " (tiempo: '$time', n\xfamero: '$c')\n"
            if($flag);
    }else{
	print $res->status_line, " (tiempo: '$time', n\xfamero: '$c')\n"
            if($flag);
	$tGlobal{"error"} += 1;
    }

    return ($time + $t);
}
