0. Descripción de la sesión de laboratorio
 

0.1 El Modelo HTML-HTTP

La figura 0.1-1  presenta la forma de trabajo del modelo de publicación de documentos HTML sobre protocolo HTTP. Este modelo cliente servidor esta constituido basicamente por tres entidades básicas: El browser cliente -que permite desplegar la informacion de los documentos html solicitados-, la red -como medio de transporte-,  el proceso servidor de HTTP que permite distribuir los documentos html bajo su tuicion hacia los diferentes browser que requieren de ellos.
 

 
Fig. 0.1-1: Forma de trabajo modelo HTML-HTTP
La forma de trabajo del modelo es mas o menos la siguiente:
1. Generacion del requermiento
El usuario solicita un documento HTML a traves del browser. Para ello especifica, en el location toolbar del browser, la URL del sitio del que desea ver informacion, es decir http://host18. Una vez que el usuario presiona ENTER, el browser genera un requerimiento para traer desde el host18 el documento indicado por el usuariario. El browser genera este requerimiento sobre el protocolo HTTP dirigido a la puerta 80 de host18  y tiene la forma:
GET http://host18:80/ HTTP/1.0
accept:image/jpg, */*
connection:Keep-Alive
2. Recepcion del requerimiento
La red transporta o rutea este requerimiento hasta permitir que el proceso servidor de HTTP conectado a la puerta 80 de host18 lo escuche. Una vez que HTTP server recupera el requerimiento procede a:
Identificar el nombre del recurso que se esta solicitando
Si no es especificado en forma explicita, lo identifica como el default document.
Determinar el path virtual que identifica el recurso.
Si path virtual es vacio, lo define como el root directory
Si path virtual es no vacio resuelve el path fisico asociado a traves de su tabla de mapping

3. Procesamiento del requerimiento
Si path virtual no indica un directorio virtual definido como directorio de cgi, entonces procese a abrir el archivo solicitado.

4. Lectura del documento solicitado
HTTP server lee el documento, lo cierra y luego lo interpreta.

5. Envio de respuesta
Una vez interpretado o entendido el documento, el servidor de HTTP lo envia, a traves de la red, hacia el host que lo solicito.

6. Recepcion de la respuesta
La red permite que el browser ejecutandose sobre el host6 escuche la respuesta, recupere el codigo html contenido, lo interprete y lo despliegue.

0.2 El Modelo CGI-HTTP
 
La forma de trabajo del modelo es mas o menos la siguiente:
1. Generacion del requermiento
El usuario solicita un formulario HTML a traves del browser. Para ello especifica, en el location toolbar del browser, la URL del sitio de sitio que contiene el formulario, en este caso http://host18/login.html. Una vez que el usuario presiona ENTER, el browser genera un requerimiento para traer desde el host18 el documento html que contiene el formulario. El browser genera este requerimiento sobre el protocolo HTTP dirigido a la puerta 80 de host18  y tiene la forma:
GET http://host18:80/login.html HTTP/1.0
accept:image/jpg, */*
connection:Keep-Alive
2. Recepcion del requerimiento
La red transporta o rutea este requerimiento hasta permitir que el proceso servidor de HTTP conectado a la puerta 80 de host18 lo escuche. Una vez que HTTP server recupera el requerimiento procede a:
Identificar el nombre del recurso que se esta solicitando
Si no es especificado en forma explicita, lo identifica como el default document.
Determinar el path virtual que identifica el recurso.
Si path virtual es vacio, lo define como el root directory
Si path virtual es no vacio resuelve el path fisico asociado a traves de su tabla de mapping

3. Procesamiento del requerimiento
Como el path virtual no indica un directorio virtual definido como directorio de cgi, entonces HTTP Server procese a abrir, para lectura, el archivo login.html

4. Lectura del documento solicitado
HTTP server lee el documento, lo cierra y luego lo interpreta.

5. Envio de respuesta
Una vez interpretado o entendido el documento, el servidor de HTTP lo envia, a traves de la red, hacia el host que lo solicito.

6. Recepcion de la respuesta
La red permite que el browser ejecutandose sobre el host6 escuche la respuesta, recupere el codigo html contenido, lo interprete y proceda a desplegar el formulario contenido en el. Una muestra del codigo html del formulario desplegado se indica en la figura 0.3.6-1.

 
<FORM ACTION="http://host18/wincgi/firstcgi.exe/login" METHOD="POST"> 
<INPUT TYPE="text" NAME="User"" SIZE="10" MAXLENGTH="10" > 
<INPUT TYPE="password" NAME="Pass"" SIZE="10" MAXLENGTH="10" > 
<INPUT TYPE="hidden" NAME="Param1" VALUE="secret1"> 
<INPUT TYPE="submit" VALUE="Envia Informacion" > 
</FORM>
Fig. 0.3.6-1

El usuario procede a llenar los campos del tipo <INPUT TYPE="text" ... > que se despliegan de forma grafica en el browser. Cada campo tiene un nombre logico definido por NAME. Este nombre logico permite, en el codigo de la CGI la posterior recuperacion de la informacion contenida.

7. Envio del formulario
Una vez  que el formulario es respondido, el usuario procede a enviar la informacion. Para ello presiona el boton grafico definido en el campo <INPUT TYPE="submit" ... >. En ese momento el browser procede a enviar la informacion hacia la URL indicada en <FORM ACTION = "http://host/wincgi/firstcgi.exe/login" con el metodo indicado por METHOD="POST".

8. Recepcion de la informacion
La red transporta o rutea este requerimiento de ejecucion de CGI hasta permitir que el proceso servidor de HTTP conectado a la puerta 80 de host18 la escuche. Una vez que HTTP server recupera el requerimiento procede a:
Identificar el nombre del recurso que se esta solicitando a traves de su URL. En este caso la URL http://host18/wincgi/firstcgi.exe/login con metodoPOST
El HTTP Server identifica el recurso como firstcgi.exe con argumento o selector login
Determinar el path virtual  /wincgi/
Como path virtual es no vacio resuelve el path fisico asociado a traves de su tabla de mapping

9. Procesamiento del requerimiento o ejecucion de la cgi
Como path virtual identifica un directorio virtual que esta configurado como directorio de cgi, entonces procese a ejecutar y a transferir el control al proceso de cgi firstcgi.exe.

10. La cgi envia la respuesat al HTTP Server
La cgi una vez que toma el control, recupera la informacion proveniente desde el formulario, la procesa y envia los resultados hacia el servidor de HTTP.

11. HTTP envia la respuesta al browser
La cgi una vez que toma el control, recupera la informacion proveniente desde el formulario, la procesa y envia los resultados hacia el servidor de HTTP.

12. El browser escucha la respuesta
La red permite que el browser ejecutandose sobre el host6 escuche la respuesta, recupere el codigo html contenido, lo interprete, limpie su ventana activa y proceda a desplegar en ella la informacion enviada desde la cgi.

0.3 Objetivo sesion de laboratorio

El objetivo de la experiencia práctiva es enviar información  desde un formulario HTML cliente a una aplicación CGI sobre un HTTP Server y que la aplicación CGI la procese.

0.4 Configuración de HTTP

Los siguientes items, a lo menos, son necesarios de configurar

0.5. Sistema de archivos asociado al sitio web 0.6. Nota importante

0.7. Diagrama de navegación

1. Como escribir una CGI en VB

El siguiente documento intenta dar las guias generales para escribir una aplicación CGI. El nombre de la apliación CGI a construir es firstcgi.exe y supone que el formulario cliente la está siendo invocada como se indica en 1.1. , que el servidor cumple con lo indicado en 1.2 y que se cumplen los requerimientos indicados en 1.3
 

1.1 Respecto del formulario cliente
<FORM ACTION="http://host/wincgi/firstcgi.exe/login" METHOD="POST">
<INPUT TYPE="text" NAME="User"" SIZE="10" MAXLENGTH="10" >
<INPUT TYPE="password" NAME="Pass"" SIZE="10" MAXLENGTH="10" >
<INPUT TYPE="hidden" NAME="Param1" VALUE="secret1">
<INPUT TYPE="submit" VALUE="Envia Informacion" >
</FORM>
1.2. Respecto del HTTP server a utilizar
El Servidor de HTTP es compatible con Win-CGI 1.1
El directorio virtual cgi-win-directory se encuentra mapeado a un directorio físico
El directorio virtual cgi-win-directory se encuentra configurado para ejecutar aplicaciones windows cgi
1.3. Otros requerimientos.
Modulo cgi32.bas en el directorio de trabajo C:\htdocs\soiiidia\
1.2. Configuración del Proyecto en VB
1.2.1. Cree un proyecto VB, en el directorio C:\htdocs\soiiidia\.
El proyecto debe llamarse firstcgi, y solo contendra dos modulos, uno nuevo y uno existente.
1.2.2 En el modulo llamado APP, en la seccion de declaraciones se necesita declarar:
Option Explicit
Global sSelector As String
1.2.3 Ademas se requieren establecer nuevas propiedades en el proyecto: 1.2.4 Finalmente en la sección de rutinas del modulo APP se define el codigo para las rutinas CGI_Main, DoGet, DoPost como se indica a continuación:
1.3. Escriba las tres rutinas fundamentales
A continuacion se muestra el codigo propuesto a modo de guia. Este codigo puede contener errores y en ningun caso es autocontenido.
1.3.1. Escriba la rutina CGI_Main
Sub CGI_Main()
sSelector = UCase$(Mid$(CGI_LogicalPath, 2))
Send ("Content-type: text/html")
Send ("X-CGI-prog: WebSite Access Demo V1.2 (VB5/32)")
Send ("")
Send ("")

Select Case UCase$(CGI_RequestMethod)
    Case "GET":
        DoGet
    Case "POST":
        DoPost
    Case Else:
        Send ("<H2>Cannot do """ & CGI_RequestMethod & """ method</H2>")
End Select

End Sub
1.3.2. Escriba la rutina DoPost
Sub DoPost()
Select Case sSelector
Case ""
    Send("Ningun selector ha sido definido")
Case "LOGIN"
    DoLogin
Case Else:
    Send ("<H2>Post Method: Bad selector """ & sSelector & """</H2>")
End Select
End Sub
1.3.2. Escriba la rutina DoGet
Sub DoGet()
Select Case sSelector
Case ""
    Send("Ningun selector ha sido definido")
Case Else:
    Send ("<H2>Get Method: Bad selector """ & sSelector & """</H2>")
End Select
End Sub
1.4. Escriba las rutinas utilitarias
En este documento solo se escribira la rutina utilitaria DoLogin()

Sub DoLogin()
    dim szUser as string
    dim szPass as string
    dim nRet as integer

    nRet = GetParameters()
    szUser = GetSmallField("User")
    szPass = GetSmallField("Pass")
    If  NOT UserValid(szUser, szPass)  Then
            Send ("<CENTER><b>")
            Send ("Password o User provehido no es correcto<br>")
            Send ("</b></CENTER>")
            Exit Sub
    End If

End Sub