#!/usr/bin/perl # # httproxy - Proxy HTTP simple basado en Inetd. # Muestra las características propias de un proxy. # # Para instalarlo, basta con incluir una linea como la siguiente en el fichero # /etc/inetd.conf y mandar la señal HUP (kill -HUP) al demonio inetd: # # 8080 stream tcp nowait proxy /usr/bin/perl perl /usr/local/bin/httproxy # ---- ---------------- ----- ------------- ---- ------------------------ # ^ Dejar asi ^ Path al interprete de perl Este archivo # | | # Puerto en el que Usuario que ejecutara este script # escuchamos peticiones # # $Id: httproxy,v 1.6 2002/01/20 18:42:58 inigo Exp inigo $ # $Log: httproxy,v $ # Revision 1.6 2002/01/20 18:42:58 inigo # La documentacion refleja el número de versión del fichero. # # Revision 1.5 2001/12/02 23:03:40 inigo # RC-2: Renombrado a httproxy (era httproxy.pl) # # Revision 1.4 2001/12/02 14:06:34 inigo # Añadida documentacion PerlDOC. # Release Candidate 1 # # Revision 1.3 2001/11/01 12:55:49 inigo # Bugfix: Ahora enviamos el tag "HOST" en comunicaciones HTTP 1.0 y 1.1 # Documentacion: Incluidas instrucciones de uso en el fichero. # use IO::Socket; $cli_req = ""; $host = ""; $port = ""; $return = 0; $lee_req = 1; while ( $lee_req ) { $_ = <> ; # Obtenemos la solicitud y la convertimos... my $cli_in = $_; print DBG ">> $cli_in"; # La linea actual contiene http://host[:port]/resto_uri ??? if ( m/http:\/\/[A-Za-z0-9]+([A-Za-z0-9\.])*(:[0-9]+)?/g ) { $host_port = $& ; ($host, $port) = split /:/, substr ($host_port, 7); if ( $port eq "" ) { $port = 80; } # Reescribimos la linea (eliminando http://host[:port] ) s/http:\/\/[A-Za-z0-9]+([A-Za-z0-9\.])*(:[0-9]+)?//g ; $cli_in = $_ . "Host: $host\n" ; } else { if ( m/\n/g ) { if ($return > 1) { $lee_req = 0 ; } else { $return++ ; } } else { $return = 0 ; } } $cli_req .= $cli_in; } $cli_req .= "\r\n";; ### Nos conectamos con el host:puerto solicitado $sd = new IO::Socket::INET ( PeerAddr=> $host, PeerPort=> $port, Proto=> 'tcp' ); error_unreach() && exit -1 unless $sd; print $sd $cli_req; while ( $respuesta = <$sd> ) { print $respuesta; # Bastaria con un print ; ya que usamos inetd... } close ($sd); exit 0; sub error_unreach { print <Error

Error 403

No se puede acceder a $host_port


Peticion:
$cli_req

Simple http-proxy - Iñigo González ERROR_EOF } #EOF# __END__ =pod =head1 NAME httproxy.pl - proxy http sencillo escrito en perl =head1 SYNOPSIS B =head1 DESCRIPTION Proxy sencillo basado en L utilizando perl. =head1 OPTIONS El programa puede lanzarse desde L (en modo servidor), o bien utilizarse desde la linea de comandos recibiendo una petición http desde stdin o bien desde un fichero que se pase como argumento. Las dos opciones son mutuamente excluyentes. =head1 RETURN VALUE Devuelve 0 si se ha podido procesar la solicitud, o -1 si hubo algun error. =head1 ERRORS En caso de error el programa envia a stdout un mensaje formateado en html en el que comunica que no se ha podido realizar la solicitud. Si estamos utilizando un browser, este mensaje aparecera en la ventana de nuestro navegador en forma de página web. =head1 EXAMPLES Para instalar el proxy, basta con incluir una linea como la siguiente en el fichero /etc/inetd.conf y mandar la señal HUP (kill -HUP) al demonio L: C<8080 stream tcp nowait proxy /usr/bin/perl /usr/sbin/perl /usr/local/bin/httproxy.pl> Puede configurar de forma sencilla este proxy utilizando la utilidad L que acompaña a este programa. =head1 FILES /usr/sbin/in.htproxy.pl =head1 SEE ALSO L, L, L, L =head1 NOTES Este proxy no funciona como proxy-cache (como es habitual en la mayoria de los proxies web); sino como una pasarela a nivel de aplicacion. No soporta la directiva Keep-Alive del protocolo HTTP. Fuerza por defecto Keep-Alive: Close en las respuestas enviadas al cliente y cierra la conexion con el servidor tan pronto termina de recibir datos de este. =head1 CAVEATS (also called WARNINGS) Se debe tener mucho cuidado a la hora de configurar inetd; de lo contrario el proxy no se lanzara correctamente. =head1 DIAGNOSTICS Podemos saber que inetd está mal configurado si el cliente http se queda "colgado" esperando a que se produzca una conexion, o bien nos devuelve errores del tipo "Document contains no data". =head1 BUGS Esta no es una implementación completa de un proxy http; sino un "hack" a modo de prueba de concepto, y debe tratarse como tal. =head1 RESTRICTIONS Este programa no puede utilizarse como daemon independiente de L =head1 AUTHOR Iñigo Gonzalez =head1 HISTORY El programa httproxy.pl se implemento por primera ven en OpenBSD 2.9, y se publico en http://www.exocert.com/ $Id: httproxy,v 1.6 2002/01/20 18:42:58 inigo Exp inigo $ =cut