Aprendiendo CGI - Universidad de Colima

Anuncio
Aprendiendo CGI
Aplicaciones de Internet
Universidad de Colima
Facultad de Ingenieria Mecanica y Electrica
Maestria en Ciencias Computacionales
Aprendiendo CGI
HTML contiene etiquetas que le permiten al usuario la
elaboración rápida de documentos de aspecto profesional.
Pero sería fabuloso que HTML tuviera etiquetas mediante
las cuales los usuario pudieran ejecutar programas con un
navegador Web, procesar los resultados y presentarlos en
un documento HTML. ¿Se puede hacer eso? La respuesta
es no... y sí. En vez de tratar de hacer un lenguage de
programación propio, habiendo tantos tan buenos, los
diseñadores del estándar HTML hicieron algo mejor
al deseñar la CGI (Common Gateway Interface).
Aprendiendo CGI
•El CGI es un estandar para comunicar
aplicaciones externas con los servidores de
información y/o bases de datos.
•Un programa CGI es un ejecutable (script) en
tiempo real.
•Residen en un directorio especial del servidor,
bajo el control del webmaster, prohibiendo al
usuario medio crear programas CGI.
Aprendiendo CGI
El proceso detrás de CGI
1.
El usuario llama un programa CGI haciendo clic sobre un vínculo u
oprimiendo un botón.
2.
El navegador solicita autorización al servidor Web para ejecutar el
programa CGI.
3.
El servidor Web revisa la configuración y los archivos de acceso para
asegurarse que el solicitante tiene permitido el acceso al programa CGI.
4.
El servidor Web se asegura de que exista el programa CGI.
5.
Sí existe el programa, éste se ejecuta.
6.
Cualquier resultado producido por el programa CGI se devuelve al
navegador Web.
7.
El navegador Web despliega el resultado.
Aprendiendo CGI
Lenguajes comunes para programación CGI
Ø
Algún shell de Unix
Ø
C/C++
Ø
PERL
Ø
TCL
Ø
Fortran
Ø
Visual Basic
Ø
AppleScript
Aprendiendo CGI
Elección de un lenguaje para programación CGI
Ø Si el programa CGI se utiliza fundamentalmente para
efectuar comandos del sistema, un script shell de Unix
puede cumplir el objetivo.
Ø Un programa ejecutable escrito en un lenguaje como
C/C++ es una buena opción si la velocidad de ejecución
o la seguridad del código fuente es un aspecto
importante.
Ø Si la facilidad de operación o un conjunto enriquecido
de funciones es lo que usted desea, Perl será la mejor
elección.
Aprendiendo CGI
Cuando el usuario envía un formulario, el script recibe los
datos como pares nombre-valor. Los nombres son los
que se definen en las etiquetas INPUT (o las etiquetas
SELECT o TEXTAREA), y los valores aquello que el
usuario haya escrito o seleccionado.
Asi pues, el formato para una cadena enviada seria:
“nombre1=valor1&nombre2=valor2&nombre3=valor3”
Aprendiendo CGI
Cabecera
La cabecera incluye informaciones que utilizará el
servidor para construir la cabecera HTTP de su
respuesta al cliente. Tres líneas pueden aparecer
en la cabecera. La línea Content-type, la línea
Location y la línea Status.
Aprendiendo CGI
Cabecera
1.- CONTENT_TYPE
Para peticiones que tienen información
añadida, como HTTP POST y PUT, este será el
tipo de datos contenido. Indica el tipo de
datos que generará el script CGI de forma que
el cliente pueda saber cómo generarlos.
Formato: Content_type:typesubtype
Aprendiendo CGI
Cabecera
Los tipos más habituales en la programación cgi se resumen en la
tabla siguiente:
type/subtype
text/html
text/plain
image/gif
image/jpeg
image/x-xbitmap
audio/basic
aplication/postscript
Descripción
Con mucho el tipo más utilizado, indica al cliente que los datos deben
interpretarse como mandatos HTML
Indica al cliente que los datos son de texto plano, que no debe
interpretarse en ningún sentido
Son los tres tipos de imágenes soportados en general por los clientes
WWW sin llamar a un viewer externo
Es un tipo que engloba todos los formatos de sonido .au y .snd. En
general, el cliente llama a un programa externo para interpretar estos
sonidos
Indica al cliente que los datos están en formato postscript. En general, el
cliente llama a un intérprete externo para mostrar el documento postscript
Aprendiendo CGI
Cabecera
2.- LOCATION
No sólo es posible devolver cierto tipo de información a través
de un CGI, sino también un puntero a la información
deseada. Por supuesto este puntero será un URL. Para ello,
se ha definido otra cabecera de CGI denominada Location
que se emplea de la forma:
Formato: Location<URL>
Por ejemplo, la salida de un CGI podría ser:
Content-type:text/html
Location:http://highland.dit.upm.es:-8000
Lo habitual es que un CGI que responda con una cabecera Location no
incluya
cuerpo
ni
precise
de
cabecera
Content-type.
Aprendiendo CGI
Cabecera
3.- STATUS
Esta línea se utiliza muy raramente. Permite indicar el código
de retorno que el servidor debe enviar al cliente en el diálogo
HTTP.
Formato: Status:código mensaje
Cuando no se precisa esta línea, el código de retorno es '200 OK', lo
que se traduce, en el diálogo HTTP con el cliente, en la línea 'HTTP
200 OK'. Obsérvese sin embargo que los clientes no tienen en cuenta
sistemáticamente el valor de este código. Es extremadamente
IMPORTANTE, dejar una línea en blanco entre las cabeceras CGI y el
contenido de la información. Si no se hace así, el sistema no
funcionará y el cliente no podrá acceder a la información.
Aprendiendo CGI
Cuerpo
El cuerpo contiene los datos del documento. Deben corresponder al
tipo MIME anunciado en la línea Content-type de la cabecera. En caso
contrario el cliente será incapaz de mostrar el documento.
Es importante mencionar que a la hora de programar CGI es
necesario recordar que se trabaja en un entorno concurrente en el
que hay que tener especial cuidado en el acceso a datos compartidos.
Hay que considerar que mientras se está accediendo a ciertos datos,
otro programador puede estar cambiándolos. Por ello , habrá que
utilizar alguna técnica de programación concurrente, por ejemplo el
empleo de ficheros cerrojo o locks. Cuando un programa va a entrar
en la zona crítica, comprueba si hay un cerrojo y en caso de que lo
haya, espera. Cuando el cerrojo no esté presente lo creará, entrará
en zona crítica y al salir lo eliminará. Este sistema garantiza la
exclusión mutua, pero puede dar problemas de inanición, deadlock o
bloqueo si un programa muere antes de liberar el cerrojo que ha
activado.
Aprendiendo CGI
Las variables de entorno
Cuando se lanza el script cgi, el demonio httpd posiciona toda
una serie de variables de entorno. Estas variables juegan un
papel importante en la programación cgi: permitirán al
desarrollador el acceso a numerosas informaciones, respecto
al sevidor, el cliente, la máquina que ejecuta el cliente, etc.
Se trata de uno de los medios de comunicación entre el
servidor y el script cgi.
Aprendiendo CGI
Variables de entorno independientes
• SERVER_SOFTWARE
Devuelve el nombre y la versión del software
del servidor que contesta la petición de
usuario (y ejecuta el programa CGI).
Formato: nombre/versión
Aprendiendo CGI
Variables de entorno independientes
• SERVER_NAME
Devuelve nombre de host del servidor, el alias
DNS, o la dirección IP como aparecería en las
URL autoreferenciadas.
Aprendiendo CGI
Variables de entorno independientes
• GATEWAY_INTERFACE
Devuelve la revisión de la especificación CGI
con que el servidor puede trabajar.
Formato: CGI/revisión
Aprendiendo CGI
Variables de entorno especificas
• SERVER_PROTOCOL
Da el nombre y revisión del protocolo de
información con el que la petición de usuario
viene.
Formato: protocolo/revisión
Aprendiendo CGI
Variables de entorno especificas
• SERVER_PORT
Devuelve el número de puerto por el cual fue
enviada la petición.
Aprendiendo CGI
Variables de entorno especificas
• REQUEST_METHOD
Devuelve el método por el cual la petición fue
enviada. Para HTTP serán "GET", "HEAD",
"POST", etc.
Esta variable es particularmente útil en el
tratamiento de formularios. Permite saber si
un formulario se gestiona con el método GET
o con el método POST.
Aprendiendo CGI
Variables de entorno especificas
• PATH_INFO
La información extra sobre el path, tal como es dada
por el cliente. En otras palabras, podemos acceder a los
scripts por su pathname virtual, seguido de alguna
información extra. Esa información extra es enviada
como PATH_INFO. La información será decodificada por
el servidor si viene de una URL antes de pasarla al
script CGI.
Aprendiendo CGI
Variables de entorno especificas
• PATH_TRANSLATED
El servidor proporciona una versión traducida
del PATH_INFO, que transforma el path virtual
al físico.
Aprendiendo CGI
Variables de entorno especificas
• SCRIPT_NAME
Nombre del script a partir de la raíz del
servidor Web.
Por ejemplo:
SCRIPT_NAME=/cgi-bin/test_script
Aprendiendo CGI
Variables de entorno especificas
• QUERY_STRING
La información que sigue al signo ‘?’ en la URL
que referencia al script. Es la información de
la pregunta. No deberá ser decodificada de
ningún modo. Esta variable será activada
cuando hay una petición de información, sin
hacer caso de la decodificación de la línea de
comandos.
Aprendiendo CGI
Variables de entorno especificas
• REMOTE_HOST
El nombre de host que realiza la petición. Si el
servidor no posee esta información activará
REMOTE_ADDR y dejará esta desactivada.
Aprendiendo CGI
Variables de entorno especificas
• REMOTE_ADDR
La dirección IP del host remoto que realiza la
petición.
Aprendiendo CGI
Variables de entorno especificas
• AUTH_TYPE
Si el servidor soporta autentificación de
usuario , y el script está protegido, esta es el
método de autentificación específico del
protocolo para validar el usuario.
Aprendiendo CGI
Variables de entorno especificas
• REMOTE_USER
Si el servidor soporta autentificación de
usuario , y el script está protegido, este será
el nombre de usuario con el que se ha
autentificado.
Aprendiendo CGI
Variables de entorno especificas
• REMOTE_IDENT
Si el servidor HTTP soporta autentificación
RFC 931 , entonces está variable se activará
con el nombre del usuario remoto obtenido
por el servidor. Esta variable solo se utilizará
durante el login.
Aprendiendo CGI
Variables de entorno especificas
• CONTENT_LENGTH
La longitud del contenido tal como es dado
por el cliente. Esta variable permite en
particular conocer el número de caracteres a
leer de la entrada estándar en el tratamiento
de un formulario con el método POST.
Aprendiendo CGI
Variables de entorno especificas
• HTTP_ACCEPT
Los tipos MIME que el cliente aceptará, como son
dados por las cabeceras HTTP. Otros protocolos pueden
ser necesarios para obtener esa información de algún
otro lugar. Cada elemento de esta lista deberá estar
separado por comas por la especificación HTTP.
Formato: tipo/subtipo, tipo/subtipo
Aprendiendo CGI
Variables de entorno especificas
• HTTP_USER_AGENT
El navegador que el cliente usa para mandar
la petición.
Formato general:
software/versión librería/versión.
Aprendiendo CGI
Ejercicio HOLA MUNDO
Cómo tenemos algunos conocimientos de programación, haremos juntos el ejemplo básico de todo curso, el
programa "Hola Mundo". Como resultado obtendremos una página html que dirá solamente eso, "Hola Mundo".
Al igual que en casi todo
El código básico en lenguaje C es:
lenguaje
de
programación
/* Programa Hola Mundo */
/* Autor: Juan Manuel Doren */
/* [email protected] */
/* Compilar en unix con: gcc -i hola.c -o hola.cgi */
int main() {
printf("Content-Type: text/html\n\n");
printf("<html>Hola Mundo</html>\n");
return( 0 );
}
este
programita
es
muy
sencillo.
Aprendiendo CGI
Ejercicio Envia Chiste
En este ejercicio vamos a guardar los datos escritos por el usuario en un archivo para poder
recuperarlos posteriormente. Como ejemplo utilizaremos un formulario para enviar chistes. Este
formulario obtendrá la siguiente información y lo guardará en las variables indicadas entre
paréntesis:
Nombre del Usuario (nombre)
Un Chiste (chiste)
Para ello creamos un formulario simple con el siguiente código:
<form method="POST" action="http://www.uva.es/cgi-bin/chiste-envio.pl">
<P>Tu nombre: <input name="nombre"></P>
<P>El chiste: <textarea cols=60 rows=5 name="chiste"></textarea></P>
<P><input type="submit" value="Enviar"><BR>
<input type="reset" value="Borrars"></P>
</form>
Aprendiendo CGI
Ejercicio Envia Chiste
Nuestro programa colocará está información para que la podamos dar el visto bueno. El programa
devolverá una nota al usuario indicándole que su envío será revisado más tarde.
Por consistencia , llamaremos a este script chiste-envio.pl.
Necesitamos iniciar y comentar nuestro script. Utilizaremos la librería cgi-lib.pl de Steve Brenner’s
para facilitar la entrada de formularios..
Seguiremos con el script que coja la entrada y devuelva e siguiente mensaje:
Gracias _nombre_, tu envío será revisado en breve.
Aprendiendo CGI
Ejercicio Envia Chiste
El script que realiza esto es el siguiente:
#!/usr/local/bin/perl
# chiste-envio.pl
# Por Javier Pérez Delgado ([email protected])
# Este script añade el chiste al archivo de chistes.
# Devuelve una nota al usuario, indicando que su chiste será revisado.
push(@INC,"/p/www/httpd/cgi-bin/");
require("cgi-lib.pl");
&ReadParse;
print &PrintHeader;
print "<HTML><HEAD>\n";
print "<TITLE>Reconocimiento de chiste</TITLE>\n";
print "</HEAD><BODY>\n";
print "Gracias ",$in{'nombre'},",Tu envío será revisado lo antes posible. .<P>\n ";
print "</BODY></HTML>\n";
Aprendiendo CGI
Ejercicio Envia Chiste
Ahora al tema central, añadir a un archivo. Para hacerlo necesitamos un archivo con permiso de
escritura para el daemon http. La creación de este archivo variará entre distintos sistemas, y
necesitaras consultar a tu webmaster. En este caso usaremos el archivo:
/users/jperez/www/tutor/chiste.txt
Para abrir el fichero para añadir al final usaremos el comando de perl para abrir ficheros, que
tiene la siguiente sintaxis:
open(FILEHANDLE,">>nombrearchivo");
FILEHANDLE es como llamaremos al archivo mientras esté abierto. Es similar a una variable.
Nombrearchivo es el archivo a abrir. Los signos ‘mayor’ (>>) son importantes, y como en el shell
indican ‘añadir a un fichero’.
Aprendiendo CGI
Ejercicio Envia Chiste
Así la orden de apertura quedará así:
open(CHISTE,">>/users/jperez/www/tutor/chiste.txt");
Nota: Es aconsejable usar letras mayúsculas para FILEHANDLE para ayudar a distinguirlo de las
variables.
Escribir a un fichero es idéntico a como hicimos previamente. La única diferencia es que el
FILEHANDLE es el primer argumento de la sentencia print, y está separado de lo que será
imprieso por un espacio. Por ejemplo para escribir la línea “Las rosas son rojas” al
FILEHANDLE CHISTE, escribiremos:
print CHISTE "Las rosas son rojas\n";
Aprendiendo CGI
Ejercicio Envia Chiste
Escribir variables se realiza de la misma manera:
print CHISTE "Las rosas son ",$in{'colorrosas'},"\n";
El código para nuestro ejemplo necesitará escribir al archivo:
1. El nombre del usuario precedido con la cadena “Nombre:”
2. Una línea en blanco.
3. El chiste enviado.
4. Una línea con 50 guiones.
El código es el siguiente:
print CHISTE "Nombre: ",$in{'nombre'},"\n";
print CHISTE "\n";
print CHISTE $in{'chiste'},"\n";
print CHISTE "--------------------------------------------------\n";
Ahora solo nos queda cerrar el fichero, y esto lo hacemos con el comando:
close FILEHANDLE;
Aprendiendo CGI
Ejercicio 1
1. #!/usr/bin/perl
2. print "Content-type:text/html\n\n";
3. print "<HTML>\n";
4. print "<HEAD><TITLE>Mi primer CGI</TITLE></HEAD>\n";
5. print "<BODY BGCOLOR =
\"#FFFFFF\"TEXT=\"#000000\">\n";
6. print "<H1>Este es el resultado de mi primer CGI</H1>\n";
7. print "</BODY>\n";
8. print "</HTML>\n";
Aprendiendo CGI
Ejercicio 2
<HTML>
<form action="nombre.cgi" method=post>
Nombre: <input type=text name=nombre size=30><p>
Apellidos: <input type=text name=apellido size=50s><p>
Email: <input type=text name=email size=20><p>
Estamento: <select name=estamento>
<option value=pas>PAS
<option value=pdi>PDI
</select>
<p> Introduzca sus comentarios:
<p> <textarea name=comentar rows=5 cols=40>
</textarea>
<input type=submit value="Enviar">
</form>
</HTML>
Aprendiendo CGI
BIBLIOGRAFIA
•Creación de servidores de bases de datos para internet con CGI.
Jeff Rowe
Prentice Hall
REFERENCIAS INTERNET
•http://www.ok.cl/cgi
•http://www.maestrosdelweb.com
•http://www.lafacu.com
•http://www.lostutoriales.com
•http://members.nbci.com/_XOOM/rbello/Tutorial/CGI
Descargar