HTMLpointHTMLpoint HTMLpoint.com


 REQUEST_METHOD: post



Como ya ha quedado claro, el método POST es más fiable porque no utiliza el carácter ? para vehicular las informaciones, sino que las envía en la forma del estándar input (el que en Perl es <STDIN> ). Obviamente está la otra cara de la moneda: las informaciones recibidas a través de POST son más difíciles de descodificar porque algunos caracteres están codificados como un % al que le sigue el código ASCII del carácter. Por ejemplo, un espacio no se verá como tal, sino como %20.
Afortunadamente, hay unos estandárd como los siguientes:

carácter
Cadena codificada
espacio
%20
/
%2F
~
%7E
:
%3A
;
%3B
@
%40
&
%26
enviar
%0A
:
%3A
|
%7C
\
%5C
<
%3C
>
%3E

Para descodificar estos datos tenemos que acudir al Perl y, más específicadamente, a las órdenes substitute y translate porque este lenguaje tiene una gran potencialidad por lo que se refiere al pattern matching y al pattern substitution. Además hay algunas expresiones irregulares que ayudan a llevar a cabo una operación de este tipo. En primer lugar vamos a ver una orden general para el pattern substitution:

$cadena =~ s/pattern/sustitución/;
que sustituye pattern con un cambio en la variable escalar $cadena. Vamos a ver rápidamente como funciona:
$cadena = "Hoy es el día 20 de septiembre";
$cadena =~ s/septiembre/octubre/;
print $cadena
visualizará "Hoy es el día 20 de octubre"

Con respecto al translate, una orden general es:

$cadena =~ tr/searchlist/replacement-list/;
Esta orden llevará a cabo el translate de todos los caracteres en searchlist con los de replacement-list.
Por ejemplo:
$cadena = "Hola, hoy es el día 20 de octubre";
$cadena =~ tr/[A,Z]/[a,z]/;
print $cadena;
analizará $cadena y transformará todos los caracteres en minúsculas que encuentre, devolviendo "Hola, Hoy es el día 20 de octubre".

Ahora volvamos al POST usando estas dos instrucciones:

$cadena =~ tr/+/ /;
$cadena =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
La primera es simple y sustituye el signo + con un espacio.
La segunda es más complicada y, a primera vista, incomprensible. A través de las expresiones regulares se producirá la sustitución de todos los % seguidos por 2 caracteres (%7E, %40 ecc.) [2] en el ASCII correspondiente, utilizando la función del Perl pack(). La función pack() es bastante complicada: para los que quieran saber más les aconsejamos que echen un vistazo a la documentación (perlfunc). De momento hay que saber que, tal como es, funciona perfectamente en este ámbito.
Vamos a ver un script funcionante:
#!/usr/bin/perl

print "Content-type:text/html\n\n";

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@parejas = split(/&/, $buffer);
foreach $pair (@parejas) {
    ($nombre, $valor) = split(/=/, $parejas);
    $valor =~ tr/+/ /;
    $valor =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $HASH{$nombre} = $valor;
}

print "<html><head><title>Form Output</title></head><body>";print "<h2>Resultados delform</h2>\n";

foreach $key (keys(%HASH)) {
    print "$key = $HASH{$key}<br>";
}

print "</body></html>";


¿Qué es lo que hace este script? Vamos a analizarlo en detalle.
El CGI lee el stream STDIN (estándar input, que son los campos del form) dejándolo en el escalar $buffer. Después pone en marcha la función split() en el buffer, actuando en las parejas "variables=valor". El bloque foreach, además, pone en marcha otro split en las parejas que se han obtenido, transformándolas en puro texto (es decir, sustituyendo los caracteres %XX) y dejándoles en un hash que nosotros llamamos %HASH. Las claves de %HASH son los input que han pasado al for. Así, por ejemplo, si tenéis un form con tres campos (nombre, apellidos, dirección), en los script se transformarán en $HASH{'nombre'}, $HASH{'apellidos'} y $HASH{'dirección'}. Al final, el script visualizará las distintas claves, un poco como hacía el script para las variables CGI.

Ahora que ya tenemos asumida la importancia de este complicadísimo script (si poseemos bases sólidas en la programación en Perl no es tan complicado, creednos), podemos pasar a las buenas noticias. Con este script se puede manejar cualquier tipo de datos de los más simples a los más complicados. Hay que tenerlo siempre en cuenta.

Después de esta breve premisa (que relamente era una pequeña excusa), vamos a ver una variante:

#!/usr/bin/perl

print "Content-type:text/html\n\n";

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@parejas = split(/&/, $buffer);
foreach $parejas (@parejas) {
   ($nombre, $valor) = split(/=/, $parejas);
    $valor =~ tr/+/ /;
    $valor =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $HASH{$nombre} = $valor;
}

$mail = '/usr/sbin/sendmail';
$destinatario = 'vosotros@dominio.it';

open (MAIL, "|$mail -t") or die("No encuentro $mail!\n");
print MAIL "To: $destinatario\n";
print MAIL "Reply-to: $HASH{'email'} ($HASH{'nombre'})\n";
# Es necesario que en el form hayáis introducido un campo 'email' y un campo 'nombre', si no perderéis el nombre y la dirección del visitador
print MAIL "Subject: Form de prueba\n\n";

foreach $key (keys(%HASH)) {
    print MAIL "$key = $HASH{$key}\n";
}

close(MAIL);

print "<html><head><title>Formresultsent</title></head>\n";
print "<body><h2>Gracias por haber acabadoelform</h2></body>\n";
print "volveral<ahref="\"index.html\">índice</a>.
print"</body></html>\n";
 

¿Qué es lo que cambia con respecto a antes? Seguramente os habréis dado cuenta de que hay una parte más del código y si lo habéis leído habréis entendido para qué sirve. Prácticamente hemos introducido bastante automatización. Por lo visto el resultado del script ya no se visualiza como una página web, sino que se envía directamente al $destinatario (siempre tendréis que rellenar este campo con vuestros datos) con sendmail, cuyo path se ha escrito como /usr/sbin/sendmail, y si en vuestro servidor la locación fuera diferente, será suficiente con especificarlo en $mail. ¿Y el visitador? Pues él verá una nueva página que le dará las gracias por haber acabado el form, con un enlace que le devuelve al índice.

os habréis dado cuenta de que también con los CGI se pueden utilizar los estándar dejando que sea nuestra fantasía y necesidad la que elebore un script todavía más efectivo.

Ahora lo controlamos todo. Guardamos el script que acabamos de analizar (o el anterior si no queréis enviar mail, en el caso de que no estéis utilizando sedmail o por otras razones) con el nombre post.cgi. Lo ponemos en marcha en el directorio cgi-bin y escribimos una página con un form como el siguiente, que os presentará cuatro campos de datos para completar con nombre, apellidos, email y dirección:

<form action="http://vuestroservidor.it/cgi-bin/post.cgi" method="POST">
     nombre: <input type="text" name="nombre">
      email: <input type="text" name="email">
          età: <input type="text" name="età">
dirección: <input type="text" name="color_preferido">
<input type="submit" value="Enviar">
<input type="reset" value="Controlar">
</form>
Podéis introducir unos datos y pasar a probarlo, si queréis introduciendo vuestras variantes. Tendría que ser todo más simple de lo que parece.


  Volver al inicio de la página