Sab May 28, 2005 7:24 pm
|
 |
dovier_antonio
Perlero Nuevo

|
Registrado: 27 May 2005
Mensajes: 15
Ubicación: Ciudad de la Habana, Cuba
|
|
| Redirector en Perl |
|
|
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 |
|
|
|

Vie Jun 10, 2005 2:04 pm
|
 |
eiial
Perlero Nuevo

|
Registrado: 20 Nov 2003
Mensajes: 48
|
|
|
|
|
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. |
|

Vie Jun 10, 2005 2:06 pm
|
 |
eiial
Perlero Nuevo

|
Registrado: 20 Nov 2003
Mensajes: 48
|
|
|
|
|
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 |
|
Lun Jun 13, 2005 6:47 am
|
 |
monoswim
Vive para Perl en Español

|
Registrado: 18 Nov 2003
Mensajes: 712
Ubicación: Buenos Aires
|
|
|
|
|
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 |
|

Lun Jun 13, 2005 9:54 am
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
| eiial escribió: | 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: |
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 ). |
|

Lun Jun 13, 2005 12:59 pm
|
 |
eiial
Perlero Nuevo

|
Registrado: 20 Nov 2003
Mensajes: 48
|
|
|
|
|
GRACIAS!!! Chicos, si de vez en cuando me tomo mi tiempito y me dos una vuelta por perl en español
Bueno aparte de eso solo quiero aclarales algo para
| 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 ). |
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: |
| 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: |
| 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: |
| 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.
| Código: |
| 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: |
| 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 |
|

Lun Jun 13, 2005 2:06 pm
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
| eiial escribió: |
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 escribió: |
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 escribió: |
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: |
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 escribió: |
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.
|
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 escribió: |
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 escribió: |
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: |
open( FH, 'file' ) or die $!;
|
en vez de la forma recomendada:
| Código: |
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. |
|

Mar Jun 14, 2005 3:16 pm
|
 |
eiial
Perlero Nuevo

|
Registrado: 20 Nov 2003
Mensajes: 48
|
|
|
|
|
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 |
|

Mar Jun 14, 2005 3:41 pm
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
|
|
|
| eiial escribió: |
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, |
|
Vie Ene 06, 2006 10:58 pm
|
 |
dovier_antonio
Perlero Nuevo

|
Registrado: 27 May 2005
Mensajes: 15
Ubicación: Ciudad de la Habana, Cuba
|
|
|
|
|
gracias por sus respuestas, mucho me han ayudado
saludos,
Dovier Antonio Ripoll Méndez
Universidad de las Ciencias Informáticas (UCI), CUBA |
|
Powered by phpBB © 2001, 2005 phpBB Group
|