Transcript
Page 1: CGI Common Gateway Interface (interfaz de pasarela común)

CGICommon Gateway

Interface(interfaz de pasarela común)

Gaspar Hernández Estevan

Page 2: CGI Common Gateway Interface (interfaz de pasarela común)

Í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

Page 3: CGI Common Gateway Interface (interfaz de pasarela común)

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.

Page 4: CGI Common Gateway Interface (interfaz de pasarela común)

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.

Page 5: CGI Common Gateway Interface (interfaz de pasarela común)

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).

Page 6: CGI Common Gateway Interface (interfaz de pasarela común)

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.

Page 7: CGI Common Gateway Interface (interfaz de pasarela común)

Independencia

• Independiente de:• Hardware• Software y SO.• Servidor

• No asume rutas• No asume IPs• No asume permisos.

Page 8: CGI Common Gateway Interface (interfaz de pasarela común)

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).

Page 9: CGI Common Gateway Interface (interfaz de pasarela común)

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

Page 10: CGI Common Gateway Interface (interfaz de pasarela común)

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:

Page 11: CGI Common Gateway Interface (interfaz de pasarela común)

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

Page 12: CGI Common Gateway Interface (interfaz de pasarela comú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)

Page 13: CGI Common Gateway Interface (interfaz de pasarela común)

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)

Page 14: CGI Common Gateway Interface (interfaz de pasarela común)

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

Page 15: CGI Common Gateway Interface (interfaz de pasarela común)

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)

Page 16: CGI Common Gateway Interface (interfaz de pasarela común)

VARIABLE DE ENTORNO CGI:

ACCESO DESDE C

#include <stdio.h>

char *variable;

Variable=getenv(“SERVER_NAME”);

}

Page 17: CGI Common Gateway Interface (interfaz de pasarela común)

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.

Page 18: CGI Common Gateway Interface (interfaz de pasarela común)

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>

Page 19: CGI Common Gateway Interface (interfaz de pasarela común)

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

Page 20: CGI Common Gateway Interface (interfaz de pasarela comú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.

Page 21: CGI Common Gateway Interface (interfaz de pasarela común)

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>

Page 22: CGI Common Gateway Interface (interfaz de pasarela común)

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

Page 23: CGI Common Gateway Interface (interfaz de pasarela común)

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>

Page 24: CGI Common Gateway Interface (interfaz de pasarela común)

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>

Page 25: CGI Common Gateway Interface (interfaz de pasarela común)

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>

Page 26: CGI Common Gateway Interface (interfaz de pasarela común)

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");

Page 27: CGI Common Gateway Interface (interfaz de pasarela común)

Ejemplo con formulario:Ejemplo con formulario:

Page 28: CGI Common Gateway Interface (interfaz de pasarela común)

??