• Publicidad

Redirector en Perl

¿Estás desarrollando un proyecto, o piensas hacerlo? Pon aquí tu propuesta, lo más seguro es que alguien esté interesado en ayudarte.

Redirector en Perl

Notapor dovier_antonio » 2005-05-28 20:24 @891

Hola :

Nosotros en nuestra universidad hicimos un Redirector en Perl para acoplarlo al SquidProxy pero las imágenes del sitio que redirecionamos no se visualizan...

Saludos,
Dovier Antonio Ripoll Méndez
"...Si el universo fuese un programa estaría implementado en Perl, y correría sobre un Sistema Operativo GNU/Linux..."

$_="7a65646e654d206c6c6f706952206f696e6f746e4120726569766f44";
while (s/..$//) {
print chr(hex($&))
}
Avatar de Usuario
dovier_antonio
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2005-05-27 14:21 @639
Ubicación: Ciudad de la Habana, Cuba

Publicidad

Notapor eiial » 2005-06-10 15:04 @669

Si mi memoria no falla es porque las etiquetas <img src=""> no soporta la respuesta 302 moved o sea no se pueden redireccionar.

Para realizar un proxy sobre esto hace

#!/usr/bin/perl

$|=1;

use LWP::Simple;

$ENV{'QUERY_STRING'} =~ /imagen=([^&]*)/;

my $imagen=$1;

print 'image/jpeg'."\n\n";

print get('http://www.elservidordeimagenes.com/'$imagen);

exit;

Lo que haces basicamente es usar el script como proxy, y no estas redireccionando, en este caso mandas en la url la variable imagen con el nombre y extension de la misma.
Ojo este es un ejemplo rápido para imagenes jpg para obtener el mime usa el module HEAD de LWP, si no me equivoco devolvia el mime y de última lee el encabezado de la imagen y hacete un archivo de guia con encabezado = mime, hay muchos, apache trae uno en la seccion conf.

Saludos y espero que les sirva.
eiial
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2003-11-21 00:51 @077

Notapor eiial » 2005-06-10 15:06 @671

En el caso de que hallas hecho eso y estes corriendo en un sistema operativo que reconozca archivos binario y de texto (ejemplo: windows) es porque te falta antes de la salida

binmode(STDOUT);

Saludos de nuevo
eiial
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2003-11-21 00:51 @077

Notapor monoswim » 2005-06-13 07:47 @366

Eiial, hace cuanto que no se te veía por los foros...BIENVENIDO DE REGRESO !!!!!!!

Están volviendo todos juntos, perl user, eiial, que bueno !!!

Saludos y un abrazo a todos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor Perl user » 2005-06-13 10:54 @496

eiial escribiste:Si mi memoria no falla es porque las etiquetas <img src=""> no soporta la respuesta 302 moved o sea no se pueden redireccionar.

Para realizar un proxy sobre esto hace

#!/usr/bin/perl

$|=1;

use LWP::Simple;

$ENV{'QUERY_STRING'} =~ /imagen=([^&]*)/;

my $imagen=$1;

print 'image/jpeg'."\n\n";

print get('http://www.elservidordeimagenes.com/'$imagen);

exit;

Lo que haces basicamente es usar el script como proxy, y no estas redireccionando, en este caso mandas en la url la variable imagen con el nombre y extension de la misma.
Ojo este es un ejemplo rápido para imagenes jpg para obtener el mime usa el module HEAD de LWP, si no me equivoco devolvia el mime y de última lee el encabezado de la imagen y hacete un archivo de guia con encabezado = mime, hay muchos, apache trae uno en la seccion conf.

Saludos y espero que les sirva.


Hay varios comentarios en cuanto al código:

1) use LWP::Simple siempre va antes de hacer cualquier cosa en el código ( a menos que se trate de un BEGIN block ).
2) Verifica el patrón en un if, JAMÁS des por hecho de que el patrón siempre se cumple, y menos en HTML ( incluyendo el caso sensitivo ), ya que marcará error grave al no estar estableciendo $1.
Código: Seleccionar todo
exit unless( $ENV{QUERY_STRING} =~ /imagen=([^&]*)/ );
my $imagen = $1;
print "image/jpeg\n\n";
getprint( "http://www.elservidordeimagenes.com/$imagen" );

3) No hay necesidad de usar el operador "." al momento de formar el header, si TODO lo que estas poniendo es una cadena, para que concatenas una cosa con otra?
4) Si estas usando LWP::Simple, para que imprimes get()?, usa getprin(). Además de que hay un error en la URL de allí.
5) No es necesario el exit.

NOTA: en vez del exit que puse, sería mejor un mensaje de error ( usando Carp sería lo mas recomendable ).
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor eiial » 2005-06-13 13:59 @624

GRACIAS!!! Chicos, si de vez en cuando me tomo mi tiempito y me dos una vuelta por perl en español :wink:

Bueno aparte de eso solo quiero aclarales algo para

Código: Seleccionar todo
1) use LWP::Simple siempre va antes de hacer cualquier cosa en el código ( a menos que se trate de un BEGIN block ).


En realidad lo podes poner donde quieras siempre que sea antes de llamar a la función, el begin no necesariamente debe ir antes por eso es un begin block puede ir donde quieras porque como sub rutina automatica es ejecutada si o si ante que todo, exceptuando la ubicación con otro begin block.
En el caso puntual es solo la eliminación del buffer que como requisito solo lo tenes que poner ante de la primer salida.
Como purista es verdad, debería haberlo puesto despues del use pero es solo como lo dice un ejemplo rápido.


Código: Seleccionar todo
2) Verifica el patrón en un if, JAMÁS des por hecho de que el patrón siempre se cumple, y menos en HTML ( incluyendo el caso sensitivo ), ya que marcará error grave al no estar estableciendo $1.


Aunque nadie hace hace un url parser de esa forma fue un ejemplo de lo más rápido posible, aunque es verdad si no hace match, devolvera un error, pero tene en cuenta que query_string es una variable que contiene el url y no un html, aparte el regexp no tiene los atributos para analizar html, ademas cuando uno envia una variable no es conveniente analizarla en caso sensitivo, porque podriamos llegar a confundirnos de variable.
Igual, si envias lo que corresponde funciona de 10.

Código: Seleccionar todo
3) No hay necesidad de usar el operador "." al momento de formar el header, si TODO lo que estas poniendo es una cadena, para que concatenas una cosa con otra?


Fijate que te equivocas con respecto al concatenador, cuando pones un string entre comillas dobles estas obligando a perl a evaluar su contenido, en contraposicion, cuando pones comillas simple lo toma sin evaluarlo disminuyendo procesos de perl.
Igualmente seria mucho mas lógico que si es un proxy que envie directamente la url completa de imagen.
Tambien es una vieja y buena costumbre de programación.

Código: Seleccionar todo
4) Si estas usando LWP::Simple, para que imprimes get()?, usa getprin(). Además de que hay un error en la URL de allí.


Formas de programar a mi me gusta usar get junto con print, igual estamos hablando de un caracter de diferencia solamente, aparte que al llamar a getprint obligas al autoload a cargar otra rutina que en definitiva llama a get, igual deberia haber usado algo como use LWP::Simple qw(get); que trae más beneficios.
Y sí falta el punto para concatenar, pero mis respuestas son aproximadas no exactas, pero siempre utilies, creo. :oops:

Código: Seleccionar todo
5) No es necesario el exit.


Si uno es purista siempre debe tenerlo, que a menos que trabajemos con child process, no es estrictamente necesario pero si aconsejado para mantener la coherencia.
Igual yo absolutamente siempre lo uso, cuestión de costumbre.

Código: Seleccionar todo
NOTA: en vez del exit que puse, sería mejor un mensaje de error ( usando Carp sería lo mas recomendable ).


En realidad habría que importar Carp y usar croak para que envie el mensaje de error y termine el script.

Bueno gente, espero que les sea util, pero creo que lo he dicho antes siempre escribo los script de solución bastante rápido, probablemente siempre falte alguna cosa menor pero el objetivo es guiarlos a la solución.

Les mando un abrazo a todos y que sigan creciendo con perl en español
eiial
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2003-11-21 00:51 @077

Notapor Perl user » 2005-06-13 15:06 @670

eiial escribiste:En realidad lo podes poner donde quieras siempre que sea antes de llamar a la función, el begin no necesariamente debe ir antes por eso es un begin block puede ir donde quieras porque como sub rutina automatica es ejecutada si o si ante que todo, exceptuando la ubicación con otro begin block.
En el caso puntual es solo la eliminación del buffer que como requisito solo lo tenes que poner ante de la primer salida.
Como purista es verdad, debería haberlo puesto despues del use pero es solo como lo dice un ejemplo rápido.


Claro... puedes poner un USE donde tu quieras... el parser lo que hace es identificarlo y en compile-time hacer la carga de símbolos. Nadie dijo que es obligatorio ponerlo al inicio, pero un buen estilo indica que debes hacerlo.

eiial escribiste:Aunque nadie hace hace un url parser de esa forma fue un ejemplo de lo más rápido posible, aunque es verdad si no hace match, devolvera un error, pero tene en cuenta que query_string es una variable que contiene el url y no un html, aparte el regexp no tiene los atributos para analizar html, ademas cuando uno envia una variable no es conveniente analizarla en caso sensitivo, porque podriamos llegar a confundirnos de variable.
Igual, si envias lo que corresponde funciona de 10.


Aunque contenga una URL/URI lo que quieras... mencioné que ES IMPORTANTE verificar siempre que realmente cumpla el patrón antes de dar por hecho que lo hizo... el ejemplo de html fué porque la gente tiende a cometer dicho error principalmente allí.

eiial escribiste:Fijate que te equivocas con respecto al concatenador, cuando pones un string entre comillas dobles estas obligando a perl a evaluar su contenido, en contraposicion, cuando pones comillas simple lo toma sin evaluarlo disminuyendo procesos de perl.
Igualmente seria mucho mas lógico que si es un proxy que envie directamente la url completa de imagen.
Tambien es una vieja y buena costumbre de programación.

Tampoco te confundas con eso... es necesario conocer un poco mas sobre Perl internals... internamente AMBAS cosas hacen lo mismo, si así es... LO MISMO, la cuestión aquí es estilo no performance. El uso de comillas dobles obliga interpolación entre la expresión dada y al final de todo concatena... y el uso de comillas sencillas CONCATENA... Quieres verlo tu mismo?
Código: Seleccionar todo
perl -MO=Terse -e 'print "Hi $a"'
perl -MO=Terse -e 'print "Hi ".$a'

Ojo tampoco hables de "menos procesos" eso no aplica aquí.
Hablando de lo mismo en IRC con merlyn( Randal L. Schwartz ) llegamos a la misma conclusión:
[15:02] <Amnesiac> print "Hi $a"
[15:02] <Amnesiac> and print "Hi ".$a
[15:02] <Amnesiac> what's better for you? ( without internals )
[15:02] <merlyn> the first "Hi $a"
[15:03] <Amnesiac> indeed.

eiial escribiste:Formas de programar a mi me gusta usar get junto con print, igual estamos hablando de un caracter de diferencia solamente, aparte que al llamar a getprint obligas al autoload a cargar otra rutina que en definitiva llama a get, igual deberia haber usado algo como use LWP::Simple qw(get); que trae más beneficios.
Y sí falta el punto para concatenar, pero mis respuestas son aproximadas no exactas, pero siempre utilies, creo. :oops:

Claro aquí estamos hablando de estilo principalmente. Mira... en todos tus puntos has mencionado la frase: "Es solo para ejemplificar", Sabes la cantidad de gente que programa así solo "por ejemplificar"? No es solo ejemplificar... es tener malos hábitos... y si la gente principiante lee eso... también aprenden esos malos hábitos... si nos vamos a tomar la molestía de ayudar, hay que hacerlo bien no? para eso estamos y para eso son los comentarios.
OJO: No te confundas... internamente jamás llama a get() la función getprint(), y no es recomendable meternos al tema de AUTOLOAD.
get() y getprint() tienen otras características diferentes... getprint() te ayudará incluso a evaluar si el contenido es correcto, por eso fué la recomendación.

eiial escribiste:Si uno es purista siempre debe tenerlo, que a menos que trabajemos con child process, no es estrictamente necesario pero si aconsejado para mantener la coherencia.
Igual yo absolutamente siempre lo uso, cuestión de costumbre.

No no es necesario tenerlo, Apache sabe cuando un proceso termina realmente ( este caso por tratarse de un CGI ).

eiial escribiste:En realidad habría que importar Carp y usar croak para que envie el mensaje de error y termine el script.

Claro que habría que importar croak, esa es la finalidad, los módulos existen por algo, y los buenos hábitos también. Te recomiendo ampliamente que seas de los primeros en comprar "Perl Best Practices" de Damian Conway en el momento en que salga, aprenderás mucho de ello. Igual "Effective Perl Programming" de Joseph N. Hall y Randal L. Schwartz sería una lectura que podrías hacer mientras tanto.

PD. Esto me lleva a poner el siguiente ejemplo:
Normalmente la gente usa:
Código: Seleccionar todo
open( FH, 'file' ) or die $!;

en vez de la forma recomendada:
Código: Seleccionar todo
open( my $fh, 'file' ) or die $!;

Dirán.... "¿Y eso que tiene de diferencia? funciona igual..." cierto? Pues en efecto podría funcionar "igual". Pero FH se importa como un símbolo GLOBAL... y generalmente para pasarlo como parámetro tendrás que jugar con typeglobs ( o un typeglob ref ) y local, el problema es que siendo un símbolo global podrías tener problemas de repetición en la symbol table. El alcance siempre es un valor agregado IMPORTANTE en el diseño de un programa y hay que tomarlo en cuenta. Cuestiones "sencillas" como estas serán tomadas en el nuevo libro de Damian Conway.

NOTA: Todos los comentarios anteriores son retroalimentación para todos, solo eso.
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor eiial » 2005-06-14 16:16 @719

Si en algunas cosas, no en otras, es cuestión de criterio, conocimiento, costumbre y formas de programar, el objetivo fue brindarle una solución ya que nadie se la habia podido brindar por varios dias no con presición pero si con aproximación que eso es mucho mas que nada, según mi criterio. Igualmente no recuerdo la vez que conteste perfecto la primera vez, generalmente los escribo a la cachetada y despues lo voy purificando en respuesta sucesivas, de ser necesario, aunque nada tiene que ver con la forma de programar solo con el tiempo.

Pero bueno en perl todo es cuestion de criterio, ya que ese fue el objetivo, crear un lenguaje sucio pero Práctico erl.

Aunque no prometo leer el libro ya que esta no es mi especialidad, si te aconsejo que leas el core de perl para darte cuenta de porque a algunas cosas que te dije, de hecho es así como lo aprendi.

Saludos a todos
eiial
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2003-11-21 00:51 @077

Notapor Perl user » 2005-06-14 16:41 @736

eiial escribiste:Aunque no prometo leer el libro ya que esta no es mi especialidad, si te aconsejo que leas el core de perl para darte cuenta de porque a algunas cosas que te dije, de hecho es así como lo aprendi.


Ugh... leer el core de Perl... ok... fin de la discusión.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor dovier_antonio » 2006-01-06 23:58 @040

gracias por sus respuestas, mucho me han ayudado

saludos,
Dovier Antonio Ripoll Méndez
Universidad de las Ciencias Informáticas (UCI), CUBA
"...Si el universo fuese un programa estaría implementado en Perl, y correría sobre un Sistema Operativo GNU/Linux..."

$_="7a65646e654d206c6c6f706952206f696e6f746e4120726569766f44";
while (s/..$//) {
print chr(hex($&))
}
Avatar de Usuario
dovier_antonio
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2005-05-27 14:21 @639
Ubicación: Ciudad de la Habana, Cuba


Volver a Proyectos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados