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