Common Gateway Interface CGI
La sigla CGI viene de Common
Gateway Interface, y como el nombre lo indica
corresponde a la definición de la interfaz entre los servidores WEB y las
aplicaciones que se ejecutan en el servidor. Estas aplicaciones pueden estar
construidas en cualquier lenguaje, los lenguajes mas comunes son Perl, C, y
script de unix. CGI sólo define la forma de transferir
información en ambos sentidos.
En el diagrama siguiente vemos el esquema
general en que se ejecutan programas en el servidor a través de CGI. Las
invocaciones se llevan a cabo a través del llenado de un formulario con los
parámetros que se envían al programa que corresponda. Por lo que el primer
paso es el acceso al formulario en donde se definen los campos sus tipos, y el
programa que se ejecutará cuando se envíen los datos. El segundo paso, es
justamente el envío de los datos. El tercer paso es la invocación de la
ejecución del programa referenciado (en el ejemplo, correspondiente al programa
1). Esta invocación es hecha por el servidor HTTP, quien le traspaso los
datos recibidos del cliente. Los programas CGI generan una salida,
típicamente un documento HTML, que será enviado al cliente como paso final
(cuarto).

Cada vez que se envían los datos de un formulario se crea un nuevo proceso en el servidor para ejecutar el programa en cuestión, quien genera una respuesta que se envía a través del servidor HTTP al browser, luego de lo cual se elimina el proceso creado. Esta creación de procesos implica una carga importante para el servidor, por lo cual esta modalidad de generación de contenido dinámico no es muy escalable.
Entre las acciones mas comunes de los programas CGI está el acceso a Bases de Datos, ya que de está forma se pueden accesar los datos desde su localización estándar y ser presentados y eventualmente modificados a través de páginas WEB.
La comunicación desde el browser al servidor con los datos del formulario se puede hacer en dos modalidades, a través de variables de entorno (GET) o a través de la línea de comando (POST). Específicamente, los datos van en la variable QUERY_STRING en los envíos con GET y en la entrada estándar en los envíos con POST. Adicionalmente existe un conjunto de variables de entorno que existen en ambas modalidades correspondiente a las siguientes:
SERVER_SOFTWARE Devuelve el nombre y la versión del
software del servidor de información que contesta la petición de usuario (y
ejecuta el programa cgi).
SERVER_NAME Devuelve nombre
de host del servidor, el alias DNS, o la dirección IP como aparecería en las URL
autoreferenciadas.
GATEWAY_INTERFACE Devuelve la revisión de la especificación CGI con que el servidor puede trabajar. Formato: CGI/revisión.
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.
SERVER_PORT Devuelve el
número de puerto por el cual fue enviada la petición.
REQUEST_METHOD Devuelve el método por el cual la
petición fue enviada. Para HTTP serán "GET", "HEAD", "POST", etc.
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.
PATH_TRANSLATED El servidor proporciona una
versión traducida del PATH_INFO, que transforma el path virtual al
físico.
SCRIPT_NAME Path virtual al script que va a
ejecutar, usado para autoreferenciar URL.
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.
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.
REMOTE_ADDR La dirección IP del host
remoto que realiza la petición.
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.
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.
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 varible
solo se utilizará durante el login.
CONTENT_TYPE Para
peticiones que tienen información añadida, como HTTP POST y PUT, este será el
tipo de datos contenido.
CONTENT_LENGTH La longitud
del contenido tal como es dado por el cliente.
FORMATO DE LOS DATOS DEL FORMULARIO
Los datos del formulario van en pares nombre-valor. Los nombres son los que se definieron en las etiquetas de los campos INPUT, SELECT o TEXTAREA del formulario, y los valores son lo que el usuario haya escrito o seleccionado.
Estos pares nombre-valor llegan como una gran string que necesitamos descomponer. Para facilitar este proceso existen gran cantidad de rutinas. De todas maneras el formato en que vienen estos pares tiene la forma:
"nombre1=valor1&nombre2=valor2&nombre3=valor3"
Así que sólo hay que dividir donde están los signos ‘&’ y ‘=’, y luego
hacer dos
cosas a cada nombre y valor:
1.Convertir todos los signos
‘+’ a espacios.
2.Convertir todas las secuencias ‘%xx’ al valor del
carácter cuyo valor ASCII sea
‘xx’ en hexadecimal. Por ejemplo convertir
‘%3d’ a ‘=’.
Esto se hace necesario porque la larga cadena original está
codificada según el
código URL, para permitir los signos ‘&’, ‘=’, y todo
lo que el usuario introduzca.
RESPUESTA AL USUARIO
La respuesta se envia a traves de la salida estandar, y para el caso de texto HTML como es tipicamente lo que se desea, se debe comenzar enviando el string:
Content-Type: text/html
más otra línea en blanco.