Jump to content


Photo

HttpQueryInfo


  • Please log in to reply
No replies to this topic

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 28 May 2009 - 08:35 AM



delphi
  1. BOOL HttpQueryInfo(
  2.   __in     HINTERNET hRequest,
  3.   __in     DWORD dwInfoLevel,
  4.   __inout  LPVOID lpvBuffer,
  5.   __inout  LPDWORD lpdwBufferLength,
  6.   __inout  LPDWORD lpdwIndex
  7. );



¿Os acordáis del mensaje de cHackAll Cómo resumir una descarga? Pues trasteando con ese código y añadiendo algunas cosas cosas me he encontrado con un problemilla en HttpQueryInfo. Cuando la uso para determinar lo que falta de descargar de un fichero, y el fichero terminó la descarga, deberí­a devolver en el contenido de lpvBuffer cero. Pues eso es lo que hace, pero no en todas las máquinas.

En determinados PC el comportamiento de la API cuando no se tiene nada que descargar falla y el mismo código en otro PC funciona bien.

Pongo un fragmento del código:


cpp
  1.    HINTERNET hInet, hConnect, hRequest;
  2.    HANDLE hFile;
  3.    DWORD Remainder = 0, Fail = 0, uBytes = 0, Size = 0, dwReserved = 0;
  4.    DWORD End = 0;
  5.    DWORD Ini = 0;
  6.    BOOL  Stop = false;
  7.    BOOL  Pause = false;
  8.  
  9.    BYTE Buffer[1024*64] = {0}; // 64 Kb.
  10.  
  11.    Remainder--;
  12.    Size = sizeof(Remainder);
  13.  
  14. //........
  15.  
  16.      Ini = SetFilePointer(hFile, 0, NULL, FILE_END);
  17.      lstrcat(itoa(SetFilePointer(hFile, 0, NULL, FILE_END), lstrcpy(Buffer, "range: bytes=")+13, 10), "-");
  18.      bool B = HttpAddRequestHeaders(hRequest, Buffer, lstrlen(Buffer), HTTP_ADDREQ_FLAG_ADD_IF_NEW);
  19.      if(HttpSendRequest(hRequest, NULL, 0, NULL, 0)){
  20.         HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &Remainder, &Size, &dwReserved);
  21.         if(!End) End = Remainder+Ini;
  22.         while (Remainder > 0 && InternetQueryDataAvailable(hRequest, &Size, 0, 0) && Size > 0){
  23.            InternetReadFile(hRequest, Buffer, Size, &uBytes);
  24.            Remainder -= _lwrite((HFILE)hFile, Buffer, uBytes);
  25.            Fail = 0;
  26.            // Manejo del progreso de la descarga
  27.            if(Progress){
  28.              Progress(End-Remainder, 0, End, &Stop, &Pause);
  29.              if(Stop){
  30.                 Fail = 2;
  31.                 break;
  32.              }
  33.            }
  34.         }
  35.      }
  36.  
  37. //.........



El problema de detectar que el archivo se terminó de descargar se puede solucionar de varias formas, pero lo que me intriga es el comportamiento anómalo de la API y me fastidia añadir mas código cuando tal como está funciona en algunos PCs.  *-)

He de añadir que el fallo se produce es unos PCs que se conectan a internet con un proxy (para lo que adapté el código con autentificación). No se si este detalle tiene algo que ver o es circunstancial.

Si conocéis alguna respuesta soy todo ojos.

Gracias y Saludos.


  • 0




IP.Board spam blocked by CleanTalk.