Common Common Gateway Gateway Interface Interface.

77
Common Common Gateway Gateway Interface Interface

Transcript of Common Common Gateway Gateway Interface Interface.

Page 1: Common Common Gateway Gateway Interface Interface.

CommonCommon GatewayGateway Interface Interface

Page 2: Common Common Gateway Gateway Interface Interface.

Common Gateway Interface

Introducción

Generalidades

El elemento FORM de HTML

El lado del servidor

El lenguaje C

El lenguaje PERL

El lenguaje Java

Page 3: Common Common Gateway Gateway Interface Interface.

Common Gateway Common Gateway InterfaceInterface

Introducción a CGIIntroducción a CGI

Page 4: Common Common Gateway Gateway Interface Interface.

Introducción

La programación de CGI consiste en el diseño y la escritura de programas que reciben sus entradas desde una página Web.

Los formularios HTML son el método preferido para enviar las entradas a los programas CGI.

Page 5: Common Common Gateway Gateway Interface Interface.

Introducción

Programar en CGI implica comprender y utilizar HTML (Hyper-Text Mark Up Language), HTTP (Hyper-Text Transport Protocol) y la escritura de programas en algún lenguaje de computador o shell del Sistema Operativo (Borne Shell, Korn Shell, C Shell, C, C++, PERL, Phyton, PHP Java, ...)

Page 6: Common Common Gateway Gateway Interface Interface.

Common Gateway Interface

Generalidades

Page 7: Common Common Gateway Gateway Interface Interface.

Generalidades

En la programación de CGIs, una solicitud es hecha a una URL en una localización reservada del servidor HTTP. Es el servidor quien decide que localizaciones son reservadas. Cuando una solicitud a tales URLs es hecha, el servidor HTTP regresa la salida del programa invocado al cliente.Nota:Apache, nuestro servidor Web, ha sido configurado para considerar como CGIs a las aplicaciones que residan en: $HOME/public_html/cgi-bin con extensión cgi

Page 8: Common Common Gateway Gateway Interface Interface.

Generalidades

¿Cómo hace el servidor para capturar la salida de una aplicación y dirigirla hacia al cliente?

#include <stdio.h>FILE * popen(const char *command, const char *mode);int pclose(FILE *stream);

La función popen() crea una tubería entre el programa que hace el llamado y el comando ha ser ejecutado. El argumento command consiste de una línea de comando del shell, el modo es un modo de entrada/salida, r o w

Page 9: Common Common Gateway Gateway Interface Interface.

Generalidades

#include <stdio.h> #include <stdlib.h>

int main() { char *cmd = "/usr/bin/ls *.c"; char buf[BUFSIZ]; FILE *ptr;

if ((ptr = popen(cmd, "r")) != NULL) while (fgets(buf, BUFSIZ, ptr) != NULL) (void) printf("%s", buf);

return 0;}

#include <stdio.h> #include <stdlib.h>

int main() { char *cmd = "/usr/bin/ls *.c"; char buf[BUFSIZ]; FILE *ptr;

if ((ptr = popen(cmd, "r")) != NULL) while (fgets(buf, BUFSIZ, ptr) != NULL) (void) printf("%s", buf);

return 0;}

Page 10: Common Common Gateway Gateway Interface Interface.

Generalidades

Los datos pueden ser suministrados al CGI adicionándolos al URL (usando el método GET) o como parte de la entrada estándard (usando el método POST).

También, una página Web puede capturar información y enviarla al servidor usando HTML o Java.

Page 11: Common Common Gateway Gateway Interface Interface.

Generalidades

Cuando se utiliza HTML, se usa la etiqueta FORM de HTML y los datos son enviados al programa CGI cuando el usuario efectúa ciertas acciones.

Una vez que los datos son enviados, el programa CGI genera un documento HTML con los resultados; que es enviado al usuario para que los vea.

Page 12: Common Common Gateway Gateway Interface Interface.

Common Gateway Interface

La etiqueta FORM de HTML

Page 13: Common Common Gateway Gateway Interface Interface.

La etiqueta FORM de HTML

La etiqueta FORM

Las formas permiten crear elementos de entrada asociados con un URL.

<FORM action=”URL” method=”GET”>...</FORM>

Programa CGIGET o POST

Page 14: Common Common Gateway Gateway Interface Interface.

La etiqueta FORM de HTML

El atributo action

Este atributo especifica el URL del programa CGI que procesará los datos de la forma, o una dirección de correo a donde serán enviados los datos de la forma.

Cuando se usa una dirección de correo se debe especificar el método POST

Page 15: Common Common Gateway Gateway Interface Interface.

La etiqueta FORM de HTML

El atributo method

Este atributo especifica cómo serán transmitidos los datos al servidor Web. Cuando se usa GET los datos se añaden al final de la URL, después de un cierre de interrogación (?). De otro lado, con POST, los datos son enviados aparte.

Page 16: Common Common Gateway Gateway Interface Interface.

La etiqueta FORM de HTML

Atributo enctype

Este atributo especifica el método de codificación utilizado antes de la transmisión. El valor predefinido es: application/x-www-form-urlencoded; cada espacio será convertido a un signo de más ("+") y los caracteres no alfabéticos a un signo de porcentaje ("%") seguido por dos dígitos hexadecimales.

Page 17: Common Common Gateway Gateway Interface Interface.

La etiqueta FORM de HTML

También se colocará un signo de igualdad ("=") entre los nombres de los campos y sus valores, y un ampersand ("&") entre las entidades.

http://ainsuca/~alumnoXX/cgi-bin/p2.cgi?\nombre=Colombia&\capital=Bogot%E1&\continente=Sur+Am%E9rica&\area=1178907&\poblacion=33000000\

Page 18: Common Common Gateway Gateway Interface Interface.

Common Gateway Common Gateway InterfaceInterface

El lado del servidor

Page 19: Common Common Gateway Gateway Interface Interface.

El lado del servidor

CGI permite a las páginas Web comunicarse con bases de datos u otros programas en un sistema corriendo un servidor HTTP.

Técnicamente, CGI se refiere a la situación en la que, un servidor arranca un programa externo para procesar datos y generar resultados.

Page 20: Common Common Gateway Gateway Interface Interface.

El lado del servidor

Pasos ejecutados por un CGI

Un CGI debe llevar a cabo lo siguiente:– Leer los datos.– Enviar los encabezados HTTP.– Enviar una línea en blanco.– Generar un documento.

Page 21: Common Common Gateway Gateway Interface Interface.

El lado del servidor

Leer los datos

Los datos de entrada se leen de acuerdo al método utilizado para el envio de los mismos (GET o POST).

Page 22: Common Common Gateway Gateway Interface Interface.

El lado del servidor

Enviar los encabezados HTTPEl trabajo del CGI es imitar al servidor HTTP, parcial o completamente. La forma más común es hacerlo parcialmente, generando un conjunto incompleto de encabezados y dejando al servidor HTTP llenar los demás. En este caso el CGI debe enviar la cabecera: Content-Type; normalmente, Content-Type: text/html

Page 23: Common Common Gateway Gateway Interface Interface.

El lado del servidor

Enviar una línea en blancoUna línea en blanco (CRLF) separa las cabeceras del documento principal.Enviar el documentoEl programa CGI debe enviar el documento de acuerdo a la cabecera Content-Type. En la mayoría de los casos se tratará de un documento en formato HTML.

Page 24: Common Common Gateway Gateway Interface Interface.

El lado del servidor

Programas CGI usando un script ejecutable UNIX:

#!/bin/shecho “Content-Type: text/plain”echo “”echo “Texto plano desde un CGI por un script UNIX”

#!/bin/shecho “Content-Type: text/html”echo “”echo “<html><head><title>CGI Unix Shell</title>” echo “</head><body><h1><i>”echo “HTML desde un CGI con script UNIX”echo “</i></h1></body></html>”

Page 25: Common Common Gateway Gateway Interface Interface.

El lado del servidor

Leyendo datos GET

Cuando el cliente solicita una URL CGI a través del método GET, ¿Cómo se pasan los datos al programa?

El servidor HTTP crea una variable de entorno llamada QUERY_STRING y luego ejecuta el programa externo.

Page 26: Common Common Gateway Gateway Interface Interface.

El lado del servidor

Para ilustrar este punto considérese el ejemplo a continuación

#!/bin/shecho “Content-Type: text/plain”echo “”echo “Se recibieron los siguientes datos:”echo “$QUERY_STRING”

Variable de entorno

Page 27: Common Common Gateway Gateway Interface Interface.

El lado del servidor

Variables de entorno estándar CGIAUTH_TYPE: esta variable da el método de

autenticación usado por el servidor para validar a un usuario. Es tomada dede la cabecera Auth-Scheme.

CONTENT-LENGTH: especifica el número de caracteres contenidos en QUERY_STRING. Es siempre suministrada para solicitudes POST.

Page 28: Common Common Gateway Gateway Interface Interface.

El lado del servidor

CONTENT_TYPE: especifica el tipo MIME del los datos añadidos. Usualmente no se especifica.

DOCUMENT_ROOT: regresa el camino de la carpeta donde residen los documentos HTML.

GATEWAY_INTERFACE: regresa la versión del servidor CGI.

Page 29: Common Common Gateway Gateway Interface Interface.

El lado del servidor

HTTP_XXX: este conjunto de variables mantiene los contenidos de los encabezados estándar HTTP. Una de ellas corresponde al agente usuario: HTTP_USER_AGENT.

PATH_INFO: contiene el camino virtual usado por el programa CGI.

PATH_TRANSLATED: contiene el camino real usado por los CGI.

Page 30: Common Common Gateway Gateway Interface Interface.

El lado del servidor

QUERY_STRING: esta variable contiene los datos suministrados por el usuario al añadirlos a la URL después de una ?. Llegará codificado si se envía mediante formas HTML.

REMOTE_ADDR: especifica la dirección IP del cliente.

REMOTE_HOST: especifica el nombre completamente cualificado del cliente.

Page 31: Common Common Gateway Gateway Interface Interface.

El lado del servidor

REQUEST_METHOD: el método por medio del cual fue hecho el requerimiento: GET o POST.

SCRIPT_NAME: el URL del programa CGI.

SERVER_ADDR: la dirección del servidor.

SERVER_NAME: el hostname del servidor.

SERVER_PORT: el número de puerto del servidor.

Page 32: Common Common Gateway Gateway Interface Interface.

El lado del servidor

SERVER_PROTOCOL: la versión del protocolo HTTP.

SERVER_SOFTWARE: el nombre y versión del servidor HTTP.

Page 33: Common Common Gateway Gateway Interface Interface.

El lado del servidor

Observe que lo único que necesita para crear un programa CGI es un lenguaje que le permita escribir a la consola; preferiblemente, también le debe permitir leer una variable de entorno. Puede utilizar cualquiera de los siguientes programas: los shell UNIX (Bourne, Korn, C, TCSh, Bash), C, C++, VisualBasic, AppleScript, PERL, Phyton, Java, ...

Page 34: Common Common Gateway Gateway Interface Interface.

Common Gateway Common Gateway InterfaceInterface

El lenguaje C

Page 35: Common Common Gateway Gateway Interface Interface.

El lenguaje C

C es un lenguaje de propósito general que ha sido estrechamente asociado con el sistema UNIX en donde fue desarrollado puesto que tanto el sistema como los programas que corren en él están escritos en lenguaje C. Sin embargo, el lenguaje no está ligado a ningún sistema operativo o máquina.

Page 36: Common Common Gateway Gateway Interface Interface.

El lenguaje C

Definición:

“C es un lenguaje de programación de propósito general que ofrece como ventajas economía de expresión, control de flujo y estructuras de datos modernos y un rico conjunto de operadores”

Dennis Ritchie

Page 37: Common Common Gateway Gateway Interface Interface.

El lenguaje C

• Tipos de datos– bool– int– char– long– short – float– double

Modificadoresunsignedsigned

Page 38: Common Common Gateway Gateway Interface Interface.

El lenguaje C

Forfor ([inicilizador];

[condicional];

[incremento]) {

expresiones;

}

Whilewhile (condición) {

expresiones;

}

Do-whiledo {

expresiones;

} while (condición);

Page 39: Common Common Gateway Gateway Interface Interface.

El lenguaje C

En el lenguaje C no existen los procedimientos, solamente hay funciones y existe una función que corresponde a la entrada de todo programa:

int main() {

/*...*/

return 0;

}

Page 40: Common Common Gateway Gateway Interface Interface.

El lenguaje C

Para simplificarle la vida al programador hay disponibles muchas funciones en Internet que permiten manipular las solicitudes GET-CGI utilizando el lenguaje C.

A continuación las implementaciones de tales funciones, tomadas del servidor HTTP de NCSA.

Page 41: Common Common Gateway Gateway Interface Interface.

El lenguaje Cvoid getword(char *word, char *line, char stop) { int x = 0,y;

for (x=0;((line[x]) && (line[x] != stop));x++) word[x] = line[x];

word[x] = '\0'; if (line[x]) ++x; y = 0;

while (line[y++] = line[x++]);}

Page 42: Common Common Gateway Gateway Interface Interface.

El lenguaje C

char *makeword(char *line, char stop) { int x = 0,y; char *word = (char *) malloc(sizeof(char) *

(strlen(line) + 1)); for (x=0; ((line[x]) && (line[x] != stop)); x++) word[x] = line[x];

word[x] = '\0'; if(line[x]) ++x; y=0;

while (line[y++] = line[x++]); return word;}

Page 43: Common Common Gateway Gateway Interface Interface.

El lenguaje Cchar *fmakeword(FILE *f, char stop, int *cl) { int wsize, ll; char *word;

wsize = 102400; ll=0; word = (char *) malloc(sizeof(char) * (wsize + 1));

while(1) { word[ll] = (char)fgetc(f); if (ll == wsize) { word[ll+1] = '\0'; wsize += 102400; word = (char*)realloc(word,sizeof(char)*(wsize+1)); }

Page 44: Common Common Gateway Gateway Interface Interface.

El lenguaje C --(*cl); if ((word[ll] == stop) || (feof(f)) || (!(*cl))) { if (word[ll] != stop) ll++; word[ll] = '\0'; word = (char *) realloc(word, ll+1); return word; } ++ll; }}

Page 45: Common Common Gateway Gateway Interface Interface.

El lenguaje Cchar x2c(char *what) { register char digit;

digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0')); return (digit);}

Page 46: Common Common Gateway Gateway Interface Interface.

El lenguaje Cvoid unescape_url(char *url) { register int x,y;

for (x=0,y=0;url[y];++x,++y) { if ((url[x] = url[y]) == '%') { url[x] = x2c(&url[y+1]); y += 2; } } url[x] = '\0';}

Page 47: Common Common Gateway Gateway Interface Interface.

El lenguaje Cvoid plustospace(char *str) { register int x;

for (x=0; str[x]; x++) if (str[x] == '+')

str[x] = ' ';}

int rind(char *s, char c) { register int x;

for (x=strlen(s) - 1;x != -1; x--) if(s[x] == c) return x;

return -1;}

Page 48: Common Common Gateway Gateway Interface Interface.

El lenguaje Cint getline(char *s, int n, FILE *f) { register int i=0; while(1) { s[i] = (char)fgetc(f);

if (s[i] == CR) s[i] = fgetc(f);

if ((s[i] == 0x4) || (s[i] == LF) || (i == (n-1))) { s[i] = '\0'; return (feof(f) ? 1 : 0); } ++i; }}

Page 49: Common Common Gateway Gateway Interface Interface.

El lenguaje Cvoid send_fd(FILE *f, FILE *fd){ char c;

while (1) { c = fgetc(f); if (feof(f)) return; fputc(c,fd); }}int ind(char *s, char c) { register int x;

for (x=0; s[x]; x++) if (s[x] == c) return x;

return -1;}

Page 50: Common Common Gateway Gateway Interface Interface.

El lenguaje C

void escape_shell_cmd(char *cmd) { register int x,y,l;

l = strlen(cmd); for (x=0; cmd[x]; x++) { if (ind("&;`'\"|*?~<>^()[]{}$\\\x0A",cmd[x]) != -

1){ for(y=l+1; y>x; y--) cmd[y] = cmd[y-1]; l++; /* length has been increased */ cmd[x] = '\\'; x++; /* skip the character */ } }}

Page 51: Common Common Gateway Gateway Interface Interface.

El lenguaje C

Page 52: Common Common Gateway Gateway Interface Interface.

Common Gateway Common Gateway InterfaceInterface

El lenguaje PERL

Page 53: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

PracticalExtraction and

Report Languge.

Fue creado por Larry Wall quien lo describe como más funcional que elegante. Hoy en día muchos creen que es lenguaje ideal para el desarrollo de scripts.

Page 54: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

Tipos de datos

Escalares: todos los números y cadenas son escalares. Los nombres de las variables escalares comienzan por el signo $.

$cantidad = 100;$descripcion = 'lápices';$respuesta = $cantidad . $descripcionprint $respuesta; # 100lápices

Page 55: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

Arreglos: un conjunto de valores escalares es un arreglo. El nombre de una variable de arreglo debe comenzar con un signo de arroba @. Un literal de arreglo es una lista de valores separados por comas y encerrados en paréntesis redondos.

@frutas = (“naranjas”, “manzanas”, “fresas”);

Page 56: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

Arreglos asociativos: son listas de valores cuyo índice es una cadena.%frutas = (“f”, “fresas”, “m”, “manzanas”, “l”, “limones”);

print $frutas{“m”}; # imprime manzanas

Existe un arreglo asociativo especial llamado %ENV que almacena el contenido de las variables de entorno.

Page 57: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

if – elseif (condición ) { expresiones;} else { expresiones;}

Whilewhile (condición ) { expresiones;}

Forfor (inicio; fin; incremento ) { expresiones;}

@vocales=("a", "e", "i", "o", "u");

for ($i=0; $i<5; $i++){ print "$vocales[$i] "; }

Page 58: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

Untiluntil (condición ) { expresiones;}

Forforeach $escalar (@arreglo) { expresiones;}

@vocales=("a", "e", "i", "o", "u");

foreach $i (@vocales){ print "$i"; }

@vocales=("a", "e", "i", "o", "u");

foreach $i (@vocales){ print "$i"; }

Page 59: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

Subrutinas: En PERL, la subunidad básica de código es la subrutina. Esta es familiar a una función C.

Las subrutinas se pueden declarar en cualquier lugar del código.

sub nombreDeLaSubrutina { declaraciones;}

Page 60: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL#!/usr/bin/perl# Impresión de las variables de entorno#print "Content-Type: text/html\n\n";

print "<html>\n";print "<head><title>";print "Variables de entorno</title></head>\n";print "<body>\n";

print << "EOF";<center><table border=2 cellpadding=10 cellspacing=10><th align=left><h3>Variables de Entorno desde PERL</h3><th align=left><h3>Contenido</h3><tr>EOF

Page 61: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

foreach $var (sort keys(%ENV)){ print "<td> $var <td> $ENV{$var}<tr>\n";}print << "EOF"</table></body></html>EOF

Page 62: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

Para invocar a una subrutina se antepone al nombre de la subrutina el carácter & (ampersand).

El valor de retorno de una subrutina es el valor de la última instrucción ejecutada. Si así se desea se puede retornar un valor usando return;

Page 63: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

#!/usr/bin/perl#$escalar = &subrutina;print "valor de retorno: $escalar\n"@arreglo = &subrutina;print "valor de retorno: @arreglo\n"sub subrutina { print "imprime y retorna.\n"; quiereunarreglo ? (a, b, c) : 0;}

%perl prueba.plimprime y retorna.valor de retorno 0imprime y retorna.valor de retorno: a b c %

%perl prueba.plimprime y retorna.valor de retorno 0imprime y retorna.valor de retorno: a b c %

Page 64: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

Primeros pasos para el manejo de un formulario

sub getFormData { my($buffer) = ""; if ($ENV{'REQUEST_METHOD'} eq 'GET') { $buffer = $ENV{'QUERY_STRING'}; } else { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }}

Page 65: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

Decodificación de los datos

sub decodeURL {

$_ = shift;

tr/+/ /;

s/%(..)/pack('c', hex($1))/eg;

return($_);

}

Page 66: Common Common Gateway Gateway Interface Interface.

El lenguaje PERL

Separe los parámetros y los campos de los valores:

foreach (split(/&/, $buffer)) {

my($key, $value) = split(/=/, $_);

$key = decodeURL($key);

$value = decodeURL($value);

%{$hashRef}->{$key} = $value;

}

Page 67: Common Common Gateway Gateway Interface Interface.

Common Gateway Common Gateway InterfaceInterface

CGI con Java

Page 68: Common Common Gateway Gateway Interface Interface.

CGI con Java

Recordemos que Java es un lenguaje de programación de propósito general, orientado a objetos, concurrente y multiplataforma.

Page 69: Common Common Gateway Gateway Interface Interface.

CGI con Java

Para poder utilizar un programa en Java como un programa CGI se debe contar con un modo de pasarle como argumento la variable de entorno QUERY_STRING, así

#!/usr/bin/sh

/usr/java/bin/java nombrePrograma “$QUERY_STRING”

#!/usr/bin/sh

/usr/java/bin/java nombrePrograma “$QUERY_STRING”

Page 70: Common Common Gateway Gateway Interface Interface.

CGI con Java

La clase URLDecoder, del paquete java.util, contiene un método para convertir desde un formato MIME llamado “x-www-form-urlencode” a un String.

Para hacer la conversión cada carácter es examinado así:

Nota: URLDecoder está disponible desde Java 2

Page 71: Common Common Gateway Gateway Interface Interface.

CGI con Java

Los caracteres ASCII de la 'a' a la 'z', de 'A' a 'Z' y de '0' a '9' se dejan igual.

El signo más ('+') es convertido a un espacio (' ').

Los demás caracteres son representados por cadenas de 3 caracteres que empiezan por un signo de porcentaje, “%xy” es la representación hexadecimal de los más bajos bits del caracter.

Page 72: Common Common Gateway Gateway Interface Interface.

CGI con Java

Veamos un modelo del uso de esta clase:

//...String s = “continente=Sur+Am%E9rica”;try { System.out.println(decode(s));} catch(Exception e) {}//...

...continente=Sur América...

...continente=Sur América...

Page 73: Common Common Gateway Gateway Interface Interface.

CGI con Java

Como se sabe, los parámetros en un GET CGI, pasan en la variable de entorno QUERY_STRING. Para leerlos debemos separar las cadenas delimitadas por un signo ampersand &.

Java cuenta con una clase que hace este trabajo: java.util.StringTokenizer

Page 74: Common Common Gateway Gateway Interface Interface.

CGI con Java

StringTokenizer pone a su disposición:– bool hasMoreTokens();– String nextToken();

Estos métodos permiten saber cuando hay más señales y cual es la cadena.

En el constructor se especifica la marca o señal que se usa.

Page 75: Common Common Gateway Gateway Interface Interface.

CGI con Java

//...private String cuerpo() { StringTokenizer t = new StringTokenizer(argumento, "&"); String mensaje = "<ul>"; while (t.hasMoreTokens()) { mensaje += "<li>" + t.nextToken() + "</li><br>\n"; } mensaje += "</ul>"; return mensaje;}//...

Page 76: Common Common Gateway Gateway Interface Interface.

Afergan Michael y otros, Programación en Web 6 en 1, QUE

Cay S. Horstmann & Gary Cornell, Core Java 2, volume I - Fundamentals, Sun Microsystems Press, Prentice Hall.

Hall, Marty, Core Web Programming, Prentice Hall, 1998

Herrmann, Eric, Programación en CGI con PERL 5, Prentice Hall.

Kernighan, Brian W., Ritchie Dennis M., El lenguaje de programación C, Prentice Hall, 2da. Edición

Medinets, David, Perl 5 by Example, Que

Bibliografía

Page 77: Common Common Gateway Gateway Interface Interface.

Bibliografía

Internet:

HyperText Transfer Protocol -- HTTP/1.1 http://www.w3.org/pub/WWW/Protocols/

The WWW Common Gateway Interface Version 1.1 http://www.ietf.org/ietf/