CGICommon Gateway
Interface(interfaz de pasarela común)
Gaspar Hernández Estevan
Índice
• Introducción• Cómo funciona• Independencia• Escribiendo un programa CGI.• Variables de entorno.• Establecimiento de la comunicación con el
cliente• Referenciar un CGI• Los formularios y CGI• Envío de información del servidor al CGI
Introducción a CGIIntroducción a CGI•Es de las primeras formas de programación web dinámica.
•El CGI cambio la forma de manipular información en el web. Antes: relación cliente-servidor mediante plugins y limitada por la velocidad.
•Es un método para la transmisión de información hacia un compilador instalado en el servidor.
Introducción a CGI•FUNCIÓN PRINCIPAL: Añadir una mayor interacción a los documentos web (devuelve información dinámica) que por medio del HTML (se presentan de forma estática).
•Corre en el servidor No depende del usuario.
•Uso: contadores, bases de datos, motores de búsqueda, formularios, generadores de email automático, foros de discusión, chats, comercio electrónico, rotadores y mapas de imágenes, juegos en línea y otros.
Introducción a CGI
•El procesamiento puede hacerlo totalmente el CGI (Procesamiento Directo).
•El CGI sirve de puente para otro programa con otro propósito (Procesamiento Indirecto).
Como funciona
• Funcionalidad de las paginas web que contengan programación CGI:
• Acción conjunta del Servidor Web y el programa almacenado (script CGI).
• Script CGI: Programa que se ejecuta en el servidor en respuesta a una solicitud del usuario.
• Lenguajes de programación: Basic, Java, C, Perl...
• Deben leer los datos de la entrada estándar• Acceder a las variables de entorno• Escribir en la salida estándar.
Independencia
• Independiente de:• Hardware• Software y SO.• Servidor
• No asume rutas• No asume IPs• No asume permisos.
Escribiendo un programa CGI
• Entrada estándar: stdin.
• Salida estándar: stdout.
• Se puede generar cualquier tipo de documento.
• Toda salida del programa CGI debe estar precedida por una cabecera tipo MIME
• Salida en formato visualizable por el navegador (no siempre).
Escribiendo un programa CGI
Content-Type:text/html
<HTML><BODY>Mi primer CGI</BODY></HTML>
#include <stdio.h>
Int main(int argc, char *argv[])
{
printf(“Content-type:texyt/html\n”);
printf(\n”);
printf(“<HTML>\n<BODY>\n”);
printf(“Mi primer CGI\n”);
printf(“</HTML>\n</BODY>\n”);
return 0;
}
Cabecera
Línea Separación
Cuerpo
Escribiendo un programa CGI
#include <stdio.h>
Int main(int argc, char *argv[])
{
//…
printf(“Location: http://www.ua.es\n”);
printf(\n”);
//…
return 0;
}
Link a otra pagina web:
VARIABLE DE ENTORNO CGI
• Transmiten datos acerca de una petición de un servidor al CGI.
• Variable sin valor o sin definir=NULL.
• Existen de 3 tipos:• Especificas de servidor• Especificas de cliente• Especificas de la petición
VARIABLE DE ENTORNO CGI: Especificas del
servidor
•Características del servidor:•GATEWAY_INTERFACE. -versión del servidor (ej: CGI/1.1)
•SERVER_NAME. -Nombre del servidor (ej: www.ua.es)
•SERVER_PORT. -Puerto del servidor donde se recibió la petición (ej:80)
•SERVER_PROTOCOL. -Nombre del protocolo de petición (ej: HTTP/1.1)
•SERVER_SOFTWARE. -Nombre del software del servidor (ej:Microsoft- IIS/4.0)
VARIABLE DE ENTORNO CGI: Especificas del cliente
• Informacion sobre el navegadorInformacion sobre el navegador• HTTP_ACCEPT: image/gif, image/jpegHTTP_ACCEPT: image/gif, image/jpeg• HTTP_ACCEPT_ENCODING: gzip, deflateHTTP_ACCEPT_ENCODING: gzip, deflate• HTTP_ACCEPT_LANGUAGE: es-ES, en, pdfHTTP_ACCEPT_LANGUAGE: es-ES, en, pdf• HTTP_REFERER: http://www.ua.es/index.htmlHTTP_REFERER: http://www.ua.es/index.html• HTTP_USER_AGENT: Mozilla/4.7 [en] (Win98; I)HTTP_USER_AGENT: Mozilla/4.7 [en] (Win98; I)
VARIABLE DE ENTORNO CGI: Especificas de la
petición
•Información sobre la petición recibida:•CONTENT_LENGTH -Tamaño en números decimales de octetos y
cualquier otra entidad adjunta
•PATH_INFO -Ruta que debe interpretar una aplicación CGI
•QUERY_STRING -Cadena de búsqueda URL-encoded.
•REMOTE_ADDR -Dirección IP del agente que hace la petición
•REMOTE_HOST -Nombre del dominio que realiza la petición
•REQUEST_METHOD -Metido de petición por el cliente.
•SCRIPT_NAME -URI para identificar la aplicación CGI
VARIABLE DE ENTORNO CGI:VARIABLE DE ENTORNO CGI: Especificas de la Especificas de la
peticiónpetición•Información sobre la petición recibida:
•CONTENT_TYPE -El tipo MIME de una entidad adjunta
•Tipos:
•Aplication -transmiten datos de la aplicación
•Text -Información textual (ej: plain)
•Multipart -Partes múltiples de tipos de datos independientes( ej: mixed, alternative..
•Message -Un mensaje encapsulado (ej: partial, External-body)
•Image -Datos de imagen (ej: gif, jpeg)
•Audio - Datos de audio (ej: basic)
•Video -Datos de video (ej mpeg)
VARIABLE DE ENTORNO CGI:
ACCESO DESDE C
#include <stdio.h>
char *variable;
Variable=getenv(“SERVER_NAME”);
}
Establecimiento de la comunicación con el
cliente• El servidor añade a la respuesta del El servidor añade a la respuesta del
CGI mas datos para devolver un CGI mas datos para devolver un mensaje HTTP correcto.mensaje HTTP correcto.
• Si no se quiere que el servidor trate los Si no se quiere que el servidor trate los datos devueltos por el CGI: Añadir el datos devueltos por el CGI: Añadir el prefijo ‘nph-’(No Parser Header) al prefijo ‘nph-’(No Parser Header) al nombre del CGI.nombre del CGI.
Referenciar un CGIReferenciar un CGI
• Usando etiquetas HTML• <a href=“direccion_del_CGI”>texto
</a>ej:<a href=“http://www.zonaweb.es/cgi-bin/hora.cgi”>Dime la hora
</a>
• Usando un formulario(lo más habitual)• <form
action=“direccion_del_CGI”><!-- elementos del formulario--></form>
LOS FORMULARIOS Y CGI
• Uso de GET• Se utiliza para obtener un fichero o recurso• La vble de entorno QUERY_STRING lee los
datos• Tamaño limitado: 256 caracteres• No registra cada petición
• Uso de POST• Se usa para enviar datos al servidor• Los datos se leen por la entrada estandar• Tamaño ilimitado (CONTENT_LEGTH devuelve
el tamaño)• Registra cada petición
LOS FORMULARIOS Y CGI
• El navegador envía los datos de la siguiente forma:
• ej: control1=valor1& control2=valor2& control3=valor3
• Para campos sin valor:• ej control1=& control2=valor2& control3=valor3
• Caracteres para dividir los datos:• &: Separa las diferentes parejas
campo/valor.• =: Separa el campo de su valor• %xx: identifica los caracteres especiales• +: Para codificar los espacios.
Envio de informacion del servidor al
CGI: Línea de comandos
• ? :Separa el CGI de los argumentos• + : separa los argumentos entre sí.
• Cada palabra es un parámetro que le llega al CGI (argv).
• Los datos se encuentran en QYERY_STRING.
<a href=“/cgi-bin/cgi?arg1+arg2+arg3>enlace</a>
Envio de informacion del servidor al Envio de informacion del servidor al
CGI: CGI: Entrada estandarEntrada estandar
• Envío mediante un formulario con POST.
• Se recibe por la entrada estándar• Uso de las vbles:
• CONTENT_LENGTH• CONTENT_TYPE
Envio de informacion del servidor al CGI:
Información de ruta de directorios
• Utilizando la vble de entorno PATH_INFO.
<a href=“/cgi-bin/cgi/MasInformación?arg1+arg2+arg3>enlace</a>
Envio de informacion del servidor al
CGI: URL
Envio mediante formularios con GET.– Formato: nom_cgi?
campo1=valor1&camop2=valor2– Los datos los recibe la vble
QUERY_STRING.
Ej: <a href=programaCGI.exe?arg1=1&arg2=5”>pincha aquí </a>
Ejemplo con formulario:Ejemplo con formulario:
<html><html><head><title>ejemplo de CGIs con <head><title>ejemplo de CGIs con
FormularioFormulario</title></head></title></head><body><body><form action="form.cgi" method="get"><form action="form.cgi" method="get"> <tr><tr> <td><b>Ejemplo de Formulario</b><br><td><b>Ejemplo de Formulario</b><br><br><br> </td></td> </tr></tr> <tr><td>Nombre</td><tr><td>Nombre</td> <td><input type="text" <td><input type="text"
maxlength="160" size="40" maxlength="160" size="40" name="nombre">name="nombre">
</td> </td> <br><br> </tr></tr> <tr><td>Color</td><tr><td>Color</td> <td><SELECT NAME="color"> <td><SELECT NAME="color"> <OPTION>Blanco<OPTION>Blanco <OPTION>Azul <OPTION>Azul <OPTION>Rojo <OPTION>Rojo </SELECT > </SELECT >
</td> </td> </tr></tr> <tr><td>País</td><tr><td>País</td> <td><SELECT NAME="pais"> <td><SELECT NAME="pais"> <OPTION value="cl">Francia<OPTION value="cl">Francia <OPTION value="es">España <OPTION value="es">España <OPTION value="zz">Portugal<OPTION value="zz">Portugal </SELECT > </SELECT > </td> </td> <br><br> </tr></tr> <tr><tr> <td><INPUT TYPE="submit" VALUE="Enviar datos"><td><INPUT TYPE="submit" VALUE="Enviar datos"> </td> </td> </tr></tr></table></table></form></form></body></body></html></html>
Ejemplo con formulario:Ejemplo con formulario:
#include <stdio.h>#include <stdio.h>#include "cgiforms.h"#include "cgiforms.h"#define LARGO_MAXIMO 1024#define LARGO_MAXIMO 1024void imprimeVariable( char *lpzNombre );void imprimeVariable( char *lpzNombre );
main(){main(){ printf("Content-Type: text/html\n\n");printf("Content-Type: text/html\n\n"); printf("<html><body bgcolor=#ffffff printf("<html><body bgcolor=#ffffff
text=#ffffff>\n");text=#ffffff>\n"); printf("<p align=center><table printf("<p align=center><table
cellpadding=4 bgcolor=000000>\n");cellpadding=4 bgcolor=000000>\n"); printf("<tr><td color=000080 printf("<tr><td color=000080
align=center>");align=center>"); printf("<b>Campos recibidos desde el printf("<b>Campos recibidos desde el
Form</b></td></tr>\n");Form</b></td></tr>\n"); imprimeVariable( "nombre" );imprimeVariable( "nombre" ); imprimeVariable( "color" );imprimeVariable( "color" ); imprimeVariable( "pais" );imprimeVariable( "pais" ); printf("</table>\n");printf("</table>\n"); printf("</body></html>");printf("</body></html>");return( 0 );return( 0 );}}
void imprimeVariable( char *lpzNombre ){void imprimeVariable( char *lpzNombre ){/*** recibe el nombre de la variable yla imprime /*** recibe el nombre de la variable yla imprime formateada como celdas de una tabla***/formateada como celdas de una tabla***/ char lpzResultado[LARGO_MAXIMO];char lpzResultado[LARGO_MAXIMO]; printf("<tr>\n");printf("<tr>\n"); printf("<td bgcolor=\"#9999FF\" valign=top>printf("<td bgcolor=\"#9999FF\" valign=top>%s</td>\n",Nombre);%s</td>\n",Nombre); printf("<td bgcolor=\"#DDDDFF\" printf("<td bgcolor=\"#DDDDFF\" valign=top><font color=#000000>");valign=top><font color=#000000>");/***aqui pide la variable y luego la imprime***//***aqui pide la variable y luego la imprime***/ formPideVariable( lpzNombre,lpzResultado,LARformPideVariable( lpzNombre,lpzResultado,LARGO_MAXIMO);GO_MAXIMO); printf(¨[%s]",lpzResultado);printf(¨[%s]",lpzResultado); printf("</td>\n");printf("</td>\n"); printf("</tr>\n");printf("</tr>\n");
Ejemplo con formulario:Ejemplo con formulario:
??