Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Permitir envio de binarios con codificación multipart/form-data utilizando la unit idISAPIRunner (https://www.clubdelphi.com/foros/showthread.php?t=80766)

PatrickM 11-10-2006 16:12:38

Permitir envio de binarios con codificación multipart/form-data utilizando la unit idISAPIRunner
 
Escribo estas lineas para quien le pueda interesar esta solución para un problema que me ha llevado 2 dias enteros de dolores de cabeza:

Si estas trabajando con una implementación de un Servidor Web heredado de TidHTTPServer y estas utilizando la unit idISAPIRunner.pas para lanzar módulos ISAPI, al utilizar INPUTS del estilo <INPUT type="file"> para cargar un fichero desde Cliente Web hacia tu ISAPI, estos llegan truncados si son ficheros Binarios.

La razon es que hay un error en la unit idISAPIRunner, permitiendo solo enviar parametros de tipo texto. El error esta en que se utiliza el procedimiento StrPCopy para copiar los parametros recibidos hacia la estructura que recibira el ISAPI. Este procedimiento trunca los datos al encontrar un código /0 ya que esta pensada para trabajar con cadenas PChar y no con ficheros Binarios.

La solución es cambiar dicho procedimiento por uno de copia mas genérico como por ejemplo Move. Este es la linia a modificar de la unit idISAPIRunner:

Código Delphi [-]
procedure TidISAPIRunner.Execute(const dllName: String; AThread: TIdPeerThread;
                  RequestInfo: TIdHTTPRequestInfo;
                  ResponseInfo: TIdHTTPResponseInfo;
                  const DocumentRoot : string;
                  dllunload : boolean = false;
                  Action : string='');
...
Begin
...

    if SameText(RequestInfo.Command, 'POST') then
     begin
       if RequestInfo.ContentLength > 0 then
        begin
         BufSize := RequestInfo.ContentLength;
         GetMem(ControlBlock.ECB.lpbData, BufSize + 1);

         // 7/10/2006 - modified by Patrick Mira (patrickmira@hotmail.com)
         //           - Allow multipart/form-data encoding with binary files
         Move(PChar(requestInfo.FormParams)^, ControlBlock.ECB.lpbData^, BufSize);
//         StrPCopy(PChar(ControlBlock.ECB.lpbData), requestInfo.FormParams);

Al González 31-12-2006 02:16:55

¡Hola Domingo!

Interesante observación domingo.

De pura casualidad, ¿será que algo así pasa con el parámetro PostData en TWebBrowser.OnBeforeNavigate2 cuando la página es multipart?

Lo digo por el caso en el que no logro "ver" en ese parámetro el valor que capturo, a diferencia de cuando la página no es multipart.

(http://www.clubdelphi.com/foros/showthread.php?t=38791&highlight=multipart)

Feliz Año 2007.

Al.

PatrickM 02-01-2007 11:10:10

No tiene nada que ver. El TWebBrowser es un cliente Web, mientras que el truco es para implementaciones de Servidores Web utilizando los componentes Indy.


La franja horaria es GMT +2. Ahora son las 22:50:49.

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