#!/usr/perl5/bin/perl -w
######################################################################
# miniproxyGueb
######################################################################
# Descripción: miniproxy para explotarlo en practicas de Distribuidos
#              version 0.1
# Autor: César Llamas Bello
# Fecha de creación: de-10-2002, (abril)
# Fecha de última modificación:
# Breve descripción:
# NOTAS: Esta en una fase muy preliminar y hay que completar
#     el manejo de los metodos y los mensajes de vuelta del servidor
#     y el manejo de segnales, entre otras cosas ...
######################################################################

 use IO::Socket;
 use Net::hostent;		# la conversión OO de gethostbyaddr

$EOL = "\015\012";
$LIN_BLANCO = $EOL x 2;

$Puerto = 9009;			# un puerto cualquiera sin usar

$servidor = IO::Socket::INET->new( Proto     => 'tcp',
                                   LocalPort => $Puerto,
                                   Listen    => SOMAXCONN,
                                   Reuse     => 1);

die "$0: No puedo arrancar el servidor" unless $servidor;
print "[Servidor $0 aceptando clientes]\n";

 while ($cliente = $servidor->accept()) {
   $cliente->autoflush(1);
   $infohost = gethostbyaddr($cliente->peeraddr);
   printf "[Conexion desde %s]\n", $infohost->name || $cliente->peerhost;

   $reserva = $linea = <$cliente>;
   chop $reserva; chop $reserva;
   undef($Puerto);
   # ($Mandato, $Uerrele, $Protocolo) = split (/\s+/, $reserva);
   ($Mandato, $_) = split (/\s+/, $reserva);
   # ($Tipo, $Bobo, $Maquina_puerto, $Ruta) = split(/\//, $Uerrele);
   ($_, $_, $Maquina_puerto, $Ruta) = split /\//, $_, 4;
   ($Maquina, $Puerto) = split(/:/, $Maquina_puerto);
   if (!defined($Puerto)) { $Puerto = 80; }
   print STDOUT "Browser> $Mandato|$Maquina_puerto\n";

   DEC_MANDATO: for ($Mandato) {
      /GET/  && do {
         printf "$0:[GET : %s, %s, %s]\n", $Maquina, $Puerto, $Ruta; last; };
      /POST/ && do {
         printf "$0:[POST: %s, %s, %s]\n", $Maquina, $Puerto, $Ruta; last; };
      /HEAD/ && do {
         printf "$0:[HEAD: %s, %s, %s]\n", $Maquina, $Puerto, $Ruta; last; };
      print STDOUT "Mandato desconocido: [$Mandato]";
   }
   $Gueb = IO::Socket::INET->new(Proto     => "tcp",
                                 PeerAddr  => $Maquina,
                                 PeerPort  => $Puerto);
   $Gueb->autoflush(1);
   printf "$0:[Conecté]\n";
   if ($chico = fork()) {
      print STDOUT "[Hijo desplegado: $chico]\n";
      print $Gueb  $linea;
      while ($linea = <$cliente>) {
          print $Gueb  $linea;
      }
      #print $Gueb  $LIN_BLANCO;
      close $Gueb;
   } else {
      $linea = <$Gueb>;
      print "Gueb> $linea";
      print $cliente $linea;

      while ($linea = <$Gueb>) {
          print $cliente $linea;
      }
      #print $cliente $LIN_BLANCO;
      wait ; 
      close $cliente;
   }
 }  
