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
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.
exit unless( $ENV{QUERY_STRING} =~ /imagen=([^&]*)/ );
my $imagen = $1;
print "image/jpeg\n\n";
getprint( "http://www.elservidordeimagenes.com/$imagen" );
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.
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 ).
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.
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.
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.
perl -MO=Terse -e 'print "Hi $a"'
perl -MO=Terse -e 'print "Hi ".$a'
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.
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.
eiial escribiste:En realidad habría que importar Carp y usar croak para que envie el mensaje de error y termine el script.
open( FH, 'file' ) or die $!;
open( my $fh, 'file' ) or die $!;
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.
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados