FoxPress – Enero 2001

 

Un Servidor HTTP en Fox

http://www.fpress.com/

 

Por Alberto Rodríguez                                       http.ZIP

 

 

¿Por qué hacer un servidor HTTP cuando está el IIS, el Apache y otros excelentes servidores http? La razón estriba en el deseo de enviar las solicitudes XML recibidas en una aplicación mediante el protocolo SOAP.

 

Mediante las páginas ASP o las ASPX también lo puedes hacer pero no todos los clientes tienen el IIS que suele ir ligado a máquinas NT/Win2K

 

Por esta razón me decidí a escribir un servidor HTTP en Fox. Quizás habría sido mejor hacerlo en C# ó en VB pero todo se andará.

 

Para hacer un servidor HTTP necesitamos que alguien esté escuchando en el puerto 80 que es el usado por el HTTP y para eso tenemos que acudir al Winsock

 

El control de Winsock no publica eventos por lo que tienes dos posibilidades:

 

a)                  encapsularlo en una clase OleBoundControl (es lo que hemos hecho)

b)                  usar el COMEVENTS

 

El ComEvents es una librería que hizo el Fox Team cuando sacó el SP3 para

publicar eventos. Lo he adjuntado entre los ficheros del mes y ahí tienes unos ejemplos de cómo usarlo. Una vez copiado deberías registrarlo.

 

Para usarlo  integrado con el VFP deberías escribir algo como esto:

 

       cVfpComClass      = "VfpCom.ComUtil"

      WSockClass        = "MSWinSock.WinSock.1"

      oVfpCom           = NULL

      nListennerPort    = 80

      oListenner        = NULL

      SocketNumber      = 1

 

 

WITH THIS

            .oVfpCom = CreateObject(.cVfpComClass)

            .oListenner = CreateObject(.WSockClass)

            .AddObject("oListennerEvents", "WinsockEvents")

            .oVfpCom.BindEvents(.oListenner, .oListennerEvents)

            .oListenner.Localport = .nListennerPort

            .oListenner.Listen()

      ENDWITH

                  

Aunque aquí usaremos el OleBoudControl pues es más cómodo.

 

1.- Para realizar nuestro ejemplo empezaremos por crear un proyecto nuevo y poner un formulario en él.

 

2.- Pon el formulario el control de Winsock

 

3.- En el Load del formulario pon:

 

 

_vfp.Autoyield = .F.

sys(2333,0)

set classlib to misclases additive

 

El Autoyield y el Sys(2333,0) hacen que los controles ActiveX funcionen mejor en Fox pues no procesarán otros eventos de Windows.

 

4.- En el Init del formulario escribe:

 

With This.Olecontrol1

      .PROTOCOL = 0

      .lOCALPORT = 80

      .lISTEN()

Endwith

 

          Con esto al ejecutar el formulario tendremos escuchando a nuestro Winsock.  Si en tu máquina tienes activo el IIS o el Personal Web Server es mejor que lo detengas antes de seguir con este ejemplo.

 

5.- En el ConnectionRequest del control escribe:

 

LPARAMETERS lrequestid

 

thisform.addobject( sys(2015), 'miSocket', m.lRequestid)

 

          Este evento se dispara tan pronto el escuchador detecta algo y pone en la variable lrequestid el identificador del socket usado.

 

          Para que el servidor sea multihread creamos una instancia de un objeto (del que todavía no he hablado) que es otro control Winsock pasándole el número del socket y dándole un nombre aleatorio con el SYS(2015).

 

          Que un servidor HTTP sea multithread es muy importante pues permite que se realicen consultas en paralelo y no una detrás de otra.

 

6.- Create una clase que puedes llamar misocket basada en OleBoundControl y guardada en un archivo llamado misclases. Una vez creado pon en el Init el siguiente código para poder capturar el socket y usarlo en esta instancia del control:

 

lpara requestid

 

this.nCreateTime = seconds()

this.accept(requestid)

 

Nota: por cierto al Load del form tendrás que haberle añadido:

 

set classlib to misclases additive

 

para que se pueda cargar la librería de clases

 

7.- Ya dentro de la clase Winsock, el que recibe la petición de datos es el método DataArrival y ahí podemos analizar la petición realizada de forma que si es un GET actuamos de una forma y si es un POST actuamos de otra.

 

Podríamos tener el siguiente código:

 

if this.state!=7

  * Si el botón de refrescar se ha pulsado muy rapidamente.

  release this

  return

  endif

 

local lcData

lcData = ''

this.GetData( @lcData )

 

this.SendData("HTTP/1.0 200 OK" + ;

       "Content-Type: text/html"+chr(13)+chr(10)+chr(13)+chr(10 ) + ;

      "<HTML><BODY>" + ;

      "<TITLE>"+ "Hola soy el título"+ "</TITLE>" + ;

      "<h1>"+"Hola y yo el cuerpo"+"</h1>" + ;

      "<p>"+"lcContents"+"</p>" +chr(13)+chr(10)+chr(13)+chr(10 ) + ;

      "<p><em>Pues yo la despedida</em></p>" + ;

      "</BODY></HTML>")

 

this.sendcomplete

 

En este código puedes ver como la cadena que se recibe se optiene por referencia en

 

this.GetData( @lcData )

 

Si a continuación para el código con un SET STEP ON podrás ver como esa cadena empieza por /POST o por /GET

 

 

En este caso empieza por GET con lo que ha sido pedida una página. Si empezara con POST quiere decir que está enviando datos al Servidor HTTP para que los procese. El texto que aparece no lo ves cuando miras el fuente de una página HTTP pues no te lo muestran los browsers pero podrías llegar a sacar esa información con los lenguajes de script.

 

A continuación preparas la cadena de respuesta y la envías.

 

Para probar todo este código yo he estado usando el Explorer. Si usas un proxy tendrás que desactivarlo y si en tu máquina tienes un servidor web deberás pararlo pues tan pronto ejecutes este programa se pondrá en situación de espera en el puerto 80 que es el ocupado por el HTTP. Desde el IE basta con que escriba http::// localhost ó el nombre de tu máquina y obtendrás la respuesta que acabamos de escribir.

 

Fox no es la herramienta ideal para hacer un servidor Web y de hecho si comparas la velocidad de respuesta con el fuente de otro servidor Web en VB que se adjunto entre los fuentes del mes pasado verás que VB es como más ligero y responde con más diligencia. Pero si tus aplicaciones están hechas en Fox y necesitas algún diálogo en la web con los clientes delgados quizás pueda ser una solución siempre que no existan muchos accesos.

 

 

 

FoxPress – Enero de 2001

© 2001 FoxPress. All rights reserved