Función WinHttpQueryDataAvailable (winhttp.h)
La función WinHttpQueryDataAvailable devuelve la cantidad de datos, en bytes, disponibles para leerse con WinHttpReadData.
Sintaxis
WINHTTPAPI BOOL WinHttpQueryDataAvailable(
[in] HINTERNET hRequest,
[out] LPDWORD lpdwNumberOfBytesAvailable
);
Parámetros
[in] hRequest
Identificador HINTERNET válido devuelto por WinHttpOpenRequest. Se debe haber llamado a WinHttpReceiveResponse para este identificador y se ha completado antes de llamar a WinHttpQueryDataAvailable.
[out] lpdwNumberOfBytesAvailable
Puntero a una variable de entero largo sin signo que recibe el número de bytes disponibles. Cuando WinHTTP se usa en modo asincrónico, establezca siempre este parámetro en NULL y recupere datos en la función de devolución de llamada; no hacerlo puede provocar un error de memoria.
Valor devuelto
Devuelve TRUE si la función se realiza correctamente o FALSE en caso contrario. Para obtener datos de error extendidos, llame a GetLastError. Entre los códigos de error devueltos se encuentran los siguientes.
Código de error | Descripción |
---|---|
|
Se ha restablecido o finalizado la conexión con el servidor, o se encontró un protocolo SSL incompatible. Por ejemplo, WinHTTP versión 5.1 no admite SSL2 a menos que el cliente lo habilite específicamente. |
|
La operación solicitada no se puede completar porque el identificador proporcionado no está en el estado correcto. |
|
El tipo de identificador proporcionado es incorrecto para esta operación. |
|
Se ha producido un error interno. |
|
La operación se canceló, normalmente porque el identificador en el que estaba funcionando la solicitud se cerró antes de que se completara la operación. |
|
La solicitud ha agotado el tiempo de espera. |
|
No había suficiente memoria disponible para completar la operación solicitada. (Código de error de Windows) |
Comentarios
Incluso cuando WinHTTP se usa en modo asincrónico (es decir, cuando WINHTTP_FLAG_ASYNC se ha establecido en WinHttpOpen), esta función puede funcionar de forma sincrónica o asincrónica. Si devuelve FALSE, se produjo un error y puede llamar a GetLastError para obtener información de error extendida. Si devuelve TRUE, use el WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE finalización para determinar si esta función se realizó correctamente y el valor de los parámetros. El WINHTTP_CALLBACK_STATUS_REQUEST_ERROR finalización indica que la operación se completó de forma asincrónica, pero no se pudo realizar.
La cantidad de datos que permanece no se vuelve a calcular hasta que se lean todos los datos disponibles indicados por la llamada a WinHttpQueryDataAvailable .
Use el valor devuelto de WinHttpReadData para determinar cuándo se ha leído completamente una respuesta.
Si se ha instalado una función de devolución de llamada de estado con WinHttpSetStatusCallback, las de las siguientes notificaciones que se han establecido en el parámetro dwNotificationFlags de WinHttpSetStatusCallback indican el progreso en la comprobación de los datos disponibles:
- WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
- WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
- WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
Ejemplos
En el ejemplo siguiente se muestra cómo usar la semántica de transacciones seguras para descargar un recurso desde un servidor HTTPS. El código de ejemplo inicializa la API winHTTP, selecciona un servidor HTTPS de destino y, a continuación, abre y envía una solicitud para este recurso seguro.
WinHttpQueryDataAvailable se usa con el identificador de solicitud para determinar la cantidad de datos disponibles para su descarga y, a continuación, Se usa WinHttpReadData para leer esos datos. Este proceso se repite hasta que se haya recuperado y mostrado todo el documento.
Importante
Si desea algunos datos lo antes posible (es decir, está procesando y analizando los datos a medida que los recibe), debe llamar a WinHttpQueryDataAvailable y WinHttpReadData. Si intenta descargar toda la respuesta lo antes posible, llame directamente a WinHttpReadData , ya que WinHttpReadData intenta rellenar el búfer antes de completarse.
Además, el ejemplo de código siguiente asigna en cada iteración de bucle. En el caso del código de producción, donde el rendimiento es importante, podría empezar con un búfer de tamaño adecuado (quizás 1 megabyte) y cambiar su tamaño si es necesario. En la práctica, WinHttpQueryDataAvailable no devuelve más de 8 kilobytes.
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen( L"WinHTTP Example/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
// Specify an HTTP server.
if (hSession)
hConnect = WinHttpConnect( hSession, L"www.microsoft.com",
INTERNET_DEFAULT_HTTPS_PORT, 0);
// Create an HTTP request handle.
if (hConnect)
hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,
NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE);
// Send a request.
if (hRequest)
bResults = WinHttpSendRequest( hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0, WINHTTP_NO_REQUEST_DATA, 0,
0, 0);
// End the request.
if (bResults)
bResults = WinHttpReceiveResponse( hRequest, NULL);
// Continue to verify data until there is nothing left.
if (bResults)
do
{
// Verify available data.
dwSize = 0;
if (!WinHttpQueryDataAvailable( hRequest, &dwSize))
printf( "Error %u in WinHttpQueryDataAvailable.\n",
GetLastError());
// Allocate space for the buffer.
pszOutBuffer = new char[dwSize+1];
if (!pszOutBuffer)
{
printf("Out of memory\n");
dwSize=0;
}
else
{
// Read the Data.
ZeroMemory(pszOutBuffer, dwSize+1);
if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer,
dwSize, &dwDownloaded))
printf( "Error %u in WinHttpReadData.\n", GetLastError());
else
printf( "%s\n", pszOutBuffer);
// Free the memory allocated to the buffer.
delete [] pszOutBuffer;
}
} while (dwSize > 0);
// Report any errors.
if (!bResults)
printf( "Error %d has occurred.\n", GetLastError());
// Close open handles.
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
Requisitos
Cliente mínimo compatible | Windows XP, Windows 2000 Professional con SP3 [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2003, Windows 2000 Server con SP3 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | winhttp.h |
Library | Winhttp.lib |
Archivo DLL | Winhttp.dll |
Redistribuible | WinHTTP 5.0 e Internet Explorer 5.01 o posterior en Windows XP y Windows 2000. |