Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-05-2010
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Question Puedo puedo recibir y redirigir http con Free Pascal bajo Linux ?

Hola a todos,

Necesito ayuda para evaluar si puedo usar Free Pascal bajo Linux para resolver el siguiente problema :

Tengo un programa cliente que envía comandos POST de http a un servidor. Tanto mi servidor como mi cliente los tengo en Windows escritos con Delphi, con el servidor desarrollado bajo los TWebApplication. Necesito colocar un servidor intermedio entre mi cliente y mi servidor, el cual estará en Linux. La idea es que reciba los http, haga un preprocesamiento y luego envíe el comando http definitivo (o sea, con la modificación del preprocesamiento) al servidor Windows.

Hacer eso teniendo un servidor intermedio también en Windows me es sumamente facil; menos de hora de trabajo. Mi problema es que necesito que el servidor intermedio sea Linux. Tengo muchos años de experiencia en Delphi; pero, no tengo ni idea de Linux, ni por supuesto ninguna experiencia de programación en Linux.

Contratar a alguién para ello es mi primera opción; pero, por donde yo vivo, es dificil porque muy pocos saben programar en Linux. Sin embargo, he escuchado de Free Pascal y quiero aprovechar que una persona nos dictará un curso de Linux (no maneja la parte de programación) para ver si yo mismo puedo resolver el problema usando Free Pascal.

Lo que quiero por tanto es que me ayuden a evaluar si se justifica intentar usar Free Pascal para esto, teniendo en cuenta que no hay necesidad de desarrollar otras cosas sobre Linux y que el tiempo de que dispongo para investigar esa opción es escaso.

Agradezco cualquier sugerencia
Responder Con Cita
  #2  
Antiguo 09-05-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Lo que no he entendido bien es qué quieres hacer en ese equipo linux.
Responder Con Cita
  #3  
Antiguo 10-05-2010
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Más detalles

Hola,

Muchas gracias por el interés. Explicó mejor :

La idea es tener una Web server application en Linux que reciba las peticiones http, las descomponga, transforme la petición en sí, y genere una nueva petición, que es la que devolverá finalmente el resultado.

A continuación voy a colocar un ejemplo simplificado de lo que sería el módulo Web en Delphi, y al final comento un poco más

Código Delphi [-]
unit UWMEnLinux;
interface
uses
  SysUtils, Classes, HTTPApp, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;
type
  TWebModuleEnLinux = class(TWebModule)
    IdLnxHTTP: TIdHTTP;
    procedure WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest;
      Response: TWebResponse; var Handled: Boolean);
  private
    { Private declarations }
    Function EnviarPostRequest(AnURL,AText:String):String;
    Function Preprocesar(AText:String):String;
  public
    { Public declarations }
  end;
var
  WebModuleEnLinux: TWebModuleEnLinux;
implementation
{$R *.dfm}
Function TWebModuleEnLinux.EnviarPostRequest(AnURL,AText:String):String;
Var
   Response:            TStringStream;
   TheLines:            TStringStream;
Begin
     Try
        Response := TStringStream.Create('');
        Try
           TheLines := TStringStream.Create(AText);
           IdLnxHTTP.Post(AnURL,TheLines,Response);
           EnviarPostRequest := Response.DataString;
        Finally
           TheLines.Free;
        End;
     Finally
        Response.Free;
     End;
End;
Function TWebModuleEnLinux.Preprocesar(AText:String):String;
Begin
     { Aqui el preprocesazmiento }
End;
procedure TWebModuleEnLinux.WebModuleBeforeDispatch(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
Var
   TheNewDomain:        String;
   TheNewContent:       String;
   TheNewRequest:       String;
begin
     TheNewDomain     := 'http://www.midominiointerno.com/midirectorio/';
     TheNewContent    := Preprocesar(Request.Content);
     TheNewRequest    := TheNewDomain + Request.PathInfo ;
     Response.Content := EnviarPostRequest(TheNewRequest,TheNewContent);
     Handled          := True;
end;
end.

Como puedes apreciar, el corazón es simplemente el evento BeforeDispatch. La petición en sí es el Request.Content, yo llamaría una función que reciba ese valor y lo transforme en una nueva petición (un nuevo Content). Ahí también respeto el pathinfo y cambio el dominio al de mi servidor Windows. Finalmente, usando Indy efectuo un nuevo Post en el método EnviarPostRequest (por supuesto esa rutina es muy simplificada respecto a la real; pero, creo que ilustra la idea).

Lo que quiero saber es si puedo escribir con Free Pascal, o similar, una rutina así de simple en Linux. En caso de poderse, agradecería cualquier ayuda de cuales componentes debería buscar para ello, así como cualquier sugerencia básica. Si piensas que hacerlo tomaría mucho tiempo, y que es mejor que busque a alguien para que escriba ese programa, agradecería el consejo

Por cierto, y para una mayor claridad, el dpr de esta librería en Delphi es :

Código Delphi [-]
library WMEnLinux;
uses
  ActiveX,
  ComObj,
  WebBroker,
  ISAPIApp,
  ISAPIThreadPool,
  UWMEnLinux in 'UWMEnLinux.pas' {WebModuleEnLinux: TWebModule};
{$R *.res}
exports
  GetExtensionVersion,
  HttpExtensionProc,
  TerminateExtension;
begin
  { CoInitFlags := COINIT_MULTITHREADED; }
  Application.Initialize;
  Application.CreateForm(TWebModuleEnLinux, WebModuleEnLinux);
  Application.Run;
end.

Nota : La línea CoInitFlags la genera Delphi; pero, yo siempre la pongo en comentarios por algún problema que me dió hace tiempo y del cual ya no me acuerdo

Saludos
Responder Con Cita
  #4  
Antiguo 10-05-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Poder, seguro que se puede. Desgraciadamente yo no tengo conocimientos sobre ese tema como para ayudarte. Veamos si algún compañero puede echarte una mano.
Responder Con Cita
  #5  
Antiguo 10-05-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Con Lazarus/Free Pascal no sé, pero si la conexión la estás haciendo por HTTP puedes aprovechar las capacidades "rewrite" de algún servidor web como Apache, lighttpd, Nginx, etc. Esto consiste en configurar el servidor, a veces creando un archivo en la raíz de datos, en el cual le dices que las peticiones que cumplan ciertos requisitos se redirijan a otro camino diferente.

Para que te hagas una idea, ese "truco" lo utilizan prácticamente todos los programas de gestión de "blogs", que analizan la URL y la traducen en una petición a la página que realmente obtiene y muestra la entrada. Así puedes escribir "www.misitio.com/articulo/me_voy_de_vacaciones" en lugar de "www.misitio.com/articulo/index.php?id=me_voy_de_vacaciones".

Aquí tienes información de la Wikipedia, para que veas lo que es.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #6  
Antiguo 10-05-2010
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Gracias. Comentarios

Hola,

Muchas gracias a ambos por el interes.

El truco de redirección ya lo había estudiado; pero, está descartado. Entre otras cosas porque el Content del Post es información encriptada con algoritmo propio.

Por lo que veo el tema no es muy conocido en la comunidad; pero, quizás pueden ayudarme con esto :

Al menos, la equivalencia entre Delphi y Lazarus/Free Pascal para el tema aplicaciones Web, tanto en cliente como en servidor, existe en términos de componentes similares ?.

Lo digo porque la lista de componentes que he visto en el sitio de Free Pascal es muy diferente a los de Delphi; pero, los comentarios dicen que pasar de Delphi a Free pascal es muy facil ?
Responder Con Cita
  #7  
Antiguo 11-05-2010
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
creo que en este link está lo que necesitas
http://wiki.lazarus.freepascal.org/W...ion_Parameters, o este otro tambien podria ayudarte
http://wiki.lazarus.freepascal.org/F...Apache_Modules
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #8  
Antiguo 11-05-2010
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Muchas gracias. Avanzamos

Hola,

Muchas gracias por el dato. Es un buen complemento a mi propias investigaciones.

Les comento lo que he averiguado:

En cuanto a los componentes Indy, existen versiones para Lazarus en Linux. Pueden descargarse de esta página:

http://www.indyproject.org/Sockets/fpc/index.en.html

Infortunadamente, según explican ahí, aún están en etapa de pruebas. De todas formas, confío en que sirvan para mis propósitos, ya que el uso planeado es muy sencillo y común; así que espero que esa parte ya sirva.

En cuanto a las Web Server application, existe un homólogo de los TWebModule, los TFPWebModule. Por lo que pude apreciar de un ejemplo casi idéntico al mío, hay cambios menores en algunos nombres; pero, esencialmente es lo mismo.

Así las cosas, solo es cuestión de esperar a tener Linux, y algún entrenamiento básico, para poder probar.

Sin embargo, hay algo que aún me preocupa, y aunque es un tema diferente, complementa este por lo que quiero preguntarlo aquí:

En un comentario que leí alguién decía que prefería tener la aplicación como un servicio FCGI y no como un módulo Apache porque cada vez que se debía reemplazar un módulo Apache había que bajar el servidor completo, aún cuando todos los demás módulos permanecieran sin cambios. Es algo con lo que se puede vivir; pero es incómodo. Mi preguntas entonces son 3 : Que es un servicio FCGI; si uso FCGI debo usar algo diferente a TFPWebModule; que tanto cambiaría mi aplicación ?
Responder Con Cita
  #9  
Antiguo 11-05-2010
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Lo que dices es muy viable. Y ademas facil.

Si indy no te sirve, puedes usar Synapse que es mas simple.

Seria ideal que montaras una maquina virtual (por ejemplo con VirtualBox o VMWare) para las pruebas locales, asi no tienes que esperar sino a instalar y ya

Algo que funciona en FPC (no lo he probado pero pinta bien):

http://z505.com/powtils/idx.shtml
----
FastCGI es una version actualizada del CGI, una interface mejorada, pero para efectos practicos y mas aun para una cosa tan elemental da como lo mismo (ademas no conozco un modulo FastCGI para Freepascal/Delphi).

----
Con todo, lo que mencionas es tan basico que no te debes preocupar mucho. Incluso lo puedes hacer como un CGI y te aseguro que podra operar muy rapido. Si ademas usas algo como http://www.cherokee-project.com/doc/...dlers_cgi.html y opcionalmente http://www.cherokee-project.com/doc/...ers_proxy.html tendras todo lo que necesitas (te pongo Cherokee porque estoy enamorado de la interface administrativa y de lo rapido que es )

Si tal como te recomendaron usas el soporte de rewrite de urls de tu servidor web, la programacion se simplifica un resto. Solo tienes que recibir los parametros y devolver las respuestas.

Una ventaja de NO hacer modulos apache ni DLLs es que el debug de los programas es mas simple. Incluso puedes correrlo por la linea de comandos!. Y si lo haces como un modulo CGI, no solo sera mas simple en general sino que sera portable a cualquier servidor web que exista, y cuando actualices el EXE no necesitas detener el servidor web por completo (aunque igualmente debes tener un sistema de update en caliente, para evitar que parte las respuestas sean en la interface nueva y otras en la vieja)
__________________
El malabarista.
Responder Con Cita
  #10  
Antiguo 11-05-2010
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Smile Gracias por el complemento. Comentarios

Hola,

Gracias por los datos complementarios.

Con respecto a las máquinas virtuales, ese es exactamente el esquema que se va a implementar. Concretamente, tendremos 2 máquinas físicas y 4 virtuales usando VMWare. 3 de ellas con Linux y la otra con Windows Server

Lo de CGI, la verdad me asaltan serias dudas. Bajo Windows, aún cuando reconozco que es un mecanismo más robusto contra fallas, lo deseché desde un principio porque cargar y descargar programas cada vez que haya que ejecutar algo es muy ineficiente. Por eso siempre he usado ISAPI.

En nuestro caso, el paso por Linux es conceptualmente muy simple; pero, el número de usuarios, si bien no es notable, tampoco es trivial (arrancaremos con más de 40 y probablemente estaremos cerca de los 100). Cada petición en sí, tampoco lo sería; ya que a muy a menudo contendrán estructuras grandes y complejas, en especial, aparte del manejo normal de registros de tablas de Bases de Datos, se espera fuerte tráfico de documentos completos, que deben almacenarse y leerse desde el servidor, y desde locaciones remotas. Agregale a esto que toda llamada pasa por un proceso de encriptamiento.

Lo de depurar, la verdad tampoco me preocupa mucho. El Linux es solo un preprocesamiento con un algoritmo corto; probablemente ni siquiera necesite depurar. Ahora, hablando en general; yo uso ISAPI con Delphi 2007 en Windows y la verdad salvo una que otra cosa, más que todo cuando estaba haciendo mis primeros experimentos con esas tecnologías, nunca he tenido problemas para depurar.

De todas formas, veo que se ha levantado el interes por el tema, así que espero que sigamos intercambiando información. Creo que el uso directo de http con Lazarus puede ser un recurso muy potente para explotarse con Linux. De momento, debido a metas de producción, no puedo dedicarle mucho tiempo; pero, ya lo tengo en la mira.

Saludos
Responder Con Cita
  #11  
Antiguo 11-05-2010
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por rolandoj Ver Mensaje
Lo de CGI, la verdad me asaltan serias dudas. Bajo Windows, aún cuando reconozco que es un mecanismo más robusto contra fallas, lo deseché desde un principio porque cargar y descargar programas cada vez que haya que ejecutar algo es muy ineficiente. Por eso siempre he usado ISAPI.
Ese es un mito muy comun. Pues resulta que fastcgi y demas es lo mismo (se lanzan procesos por cada request, aunque normalmente se reciclan procesos y todo eso y se tiene un limite). La gracia de los módulos en proceso (dll) es mas evidente en los lenguajes interpretados (php, python, .net) ya que hay que cargar el run time y ademas procesar la petición, o para soportar un pool de conexiones a una BD. Pero un lenguaje compilado, procesamiento directo? No tanto.

Cualquier OS, windows incluido, maneja de forma eficiente todo eso. Windows no carga todos los bytes d elso exe que se cargan frequentemente, hay optimizaciones para todo eso. Pa rematar lo que comentas parece que es un proceso tan simple que la carga & descarga seguramente sera muy rapido (y posiblemente mas en linux).

Ahora si como dices lo tuyo es tan simple pues si, puedes hacerlo como un modulo si asi lo deseas. Da igual.
__________________
El malabarista.
Responder Con Cita
  #12  
Antiguo 12-05-2010
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Interesante. Me entran dudas

Hola,

Interesante lo que dices; pero, me entran dudas porque, al menos aparentemente, la valoración del aspecto principal no coincide con la información que tengo desde hace mucho. Para claridad de cualquier otro que consulte este hilo, detallo lo que sé;

En Windows, la idea de la tecnología ISAPI (y de NSAPI, su contraparte Netscape) es que el DLL se carga en memoria cuando su efectua una primera petición de sus servicios. De ahí en adelante, el DLL permanece en memoria; de tal forma que cualquier nueva petición no implica leer otra vez el DLL desde disco. El DLL solo será descargado automáticamente de memoria bajo 3 circunstancias:

1. Cuando ocurra un error realmente crítico

2. Cuando el tiempo de inactividad transcurrido (tiempo sin recibir una nueva petición), exceda un límite de tolerancia establecido

3. Cuando se descargue el servidor (IIS, Apache, etc)

Este es el esquema más rápido posible en términos de consumo de recursos por parte del aplicativo en sí. Su debilidad es la posibilidad de que, por errores de programación, una petición con errores provoque un desastre mayor ya que los recursos se están compartiendo (por ejemplo, que una petición no libere recursos; con el tiempo puede agotar los disponibles). Las versiones más nuevas de IIS han incorporado mecanismo de aislamiento de procesos para atacar esa debilidad

En el caso de los lenguajes interpretados, que se apoyan en tener un DLL ISAPI para su interpretación, como bien dices, hay un paso extra, ya que primero les toca traducir los comandos. La conclusión es que enviando el comando directamente a un ISAPI propio compilado, tiene que ser más rápido. Por ello, no entiendo porque tu duda al decir :

Cita:
Pero un lenguaje compilado, procesamiento directo? No tanto.
Ahora. en el caso de los CGI, la idea es que la respuesta a la petición la brinda un ejecutable. El ejecutable se carga en memoria cuando se recibe la petición y se descarga cuando esta termina. Ciertamente, en términos de seguridad es mejor esquema, ya que cada petición queda completamente aislada y sus recursos se liberan enseguida.

Sin embargo, en términos de efeciencia es muy pobre comparada con la solución anterior, ya que el consumo de recursos, aún con el apoyo del caché, es mucho mayor, especialmente con conexiones a bases de datos, ya que en cada carga se inicializa sesión. Por supuesto, depende de las capacidades del hardware disponible y del tamaño del sistema que se desee emplear. En sistemas pequeños y con un buen hardware de respaldo, no se notarán mayores diferencias.

En mi opinión, el CGI se justifica como alternativa segura. También, en el pasado, como un mecanismo más facil de depuración; pero, con las herramientas más modernas de Delphi 2007, no le veo mayor peso, ya que depurar los DLLs ISAPI es facil
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Comparativa entre Free Pascal 2.2.0 y Turbo Pascal 7.0 esocrates Varios 2 14-07-2008 14:56:24
stringgrid , puedo recibir valores ? martita OOP 2 04-07-2005 19:21:03
manual de excepciones de object pascal para free pascal??? Garion OOP 3 27-05-2005 00:42:29
¿Cómo puedo enviar y recibir archivos vía IRC con el componente TIdIRC? DarkByte Internet 4 26-06-2004 17:54:05
Como puedo enviar y recibir imagenes por Internet JDNA Internet 4 29-03-2004 22:41:09


La franja horaria es GMT +2. Ahora son las 04:54:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi