Ver Mensaje Individual
  #1  
Antiguo 11-10-2006
PatrickM PatrickM is offline
Miembro
 
Registrado: jun 2006
Posts: 21
Reputación: 0
PatrickM Va por buen camino
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);
Responder Con Cita