Hola amigos,
¿ Habéis manipulado alguna vez un paquete WebRequest ?, necesito añadirle manualmente un Header al paquete que llega a mi WebModule.BeforeDispatch (servidor Datasnap REST).
Esto lo he podido codificar para cuando esa WebRequest es de la clase THTTPAppRequest (cuando llega a un servidor standalone), pero no consigo hacer lo mismo cuando el paquete es un TISAPIRequest (cuando el servidor Datasnap corre como módulo ISAPI sobre un servidor IIS).
El problema es que los servidores standalone solo los utilizo para desarrollar y testear, pero el servidor final debería correr como módulo ISAPI en IIS.
Este es el código que funciona en standaloneservers (paquetes THTTPAppRequest). En esos paquetes puedo utilizar un Helper para acceder a la propiedad RequestInfo oculta para uso privado del HTTPRequest y desde allí a su propiedad RawHeaders, desde donde se pueden manipular y añadir Headers al paquete.
TIdHTTPAppRequestHelper = class helper for TIdHTTPAppRequest public function GetRequestInfo: TIdEntityHeaderInfo; end; implementation function TIdHTTPAppRequestHelper.GetRequestInfo: TIdEntityHeaderInfo; begin Result := FRequestInfo; end; procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var Token: string; begin Response.SetCustomHeader('Access-Control-Allow-Origin','*'); Token := Request.Query; if Copy(Token, 1, 10) = 'dssession=' then begin if Request is TIdHTTPAppRequest then begin TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.AddValue('Pragma', Token); end; end; if FServerFunctionInvokerAction <> nil then FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker; end;
Pero cuando el paquete que me llega es un TISAPIRequest no veo como podría manipular sus Headers.
¿ Se os ocurre algo ?.
Gracias.
NOTA: Esto lo hago para sortear una deficiencia de Datasnap. Por lo que puedo ver no da soporte a CORS (llamadas Cross-Origin, para cuando tu front-end y tu back-end no se ejecutan sobre el mismo Servidor). Datasnap obliga a que los datos de autenticación/sesión se envíen mediante cabeceras Pragma en las solicitudes, pero cuando las llamadas son CORS el navegador obliga a solicitar confirmación de que se permitan pasar cabeceras, y Datasnap no responde a esas solicitudes. así que estoy intentado evitar el problema, haciendo que no se pasen cabeceras (con lo que no se activa el protocolo CORS de su confirmación), sino que paso los datos de sesión directamente a través de la URL. Pero como Datasnap espera encontrar esos datos en la cabecera Pragma, una vez llega el paquete de solicitud al Dispatcher, entonces manipulo ese paquete para dejar en la cabecera con la información que Datasnap espera encontrar.
Esto funciona bien en un standalone server, cuando el paquete de solicitud es THTTPAppRequest, pero cuando el paquete es un TISAPIRequest no sé como manipularlo para añadirle ese Header Pragma que Delphi espera encontrar.