WinHttpQueryDataAvailable, fonction (winhttp.h)
La fonction WinHttpQueryDataAvailable retourne la quantité de données, en octets, pouvant être lues avec WinHttpReadData.
Syntaxe
WINHTTPAPI BOOL WinHttpQueryDataAvailable(
[in] HINTERNET hRequest,
[out] LPDWORD lpdwNumberOfBytesAvailable
);
Paramètres
[in] hRequest
Handle HINTERNET valide retourné par WinHttpOpenRequest. WinHttpReceiveResponse doit avoir été appelé pour ce handle et avoir terminé avant l’appel de WinHttpQueryDataAvailable .
[out] lpdwNumberOfBytesAvailable
Pointeur vers une variable entière longue non signée qui reçoit le nombre d’octets disponibles. Lorsque WinHTTP est utilisé en mode asynchrone, définissez toujours ce paramètre sur NULL et récupérez les données dans la fonction de rappel ; le fait de ne pas le faire peut provoquer une erreur de mémoire.
Valeur retournée
Retourne TRUE si la fonction réussit, ou FALSE dans le cas contraire. Pour obtenir des données d’erreur étendues, appelez GetLastError. Parmi les codes d’erreur retournés figurent les suivants.
Code d'erreur | Description |
---|---|
|
La connexion au serveur a été réinitialisée ou terminée, ou un protocole SSL incompatible a été rencontré. Par exemple, WinHTTP version 5.1 ne prend pas en charge SSL2, sauf si le client l’active spécifiquement. |
|
L’opération demandée ne peut pas se terminer, car le handle fourni n’est pas dans l’état correct. |
|
Le type de handle fourni est incorrect pour cette opération. |
|
Une erreur interne s'est produite. |
|
L’opération a été annulée, généralement parce que le handle sur lequel la demande fonctionnait a été fermé avant la fin de l’opération. |
|
Le délai d'attente de la requête a expiré. |
|
La mémoire disponible n’était pas suffisante pour effectuer l’opération demandée. (Code d’erreur Windows) |
Remarques
Même lorsque WinHTTP est utilisé en mode asynchrone (c’est-à-dire, lorsque WINHTTP_FLAG_ASYNC a été défini dans WinHttpOpen), cette fonction peut fonctionner de manière synchrone ou asynchrone. S’il retourne FALSE, il a échoué et vous pouvez appeler GetLastError pour obtenir des informations d’erreur étendues. S’il retourne TRUE, utilisez la saisie semi-automatique WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE pour déterminer si cette fonction a réussi et la valeur des paramètres. La WINHTTP_CALLBACK_STATUS_REQUEST_ERROR’achèvement indique que l’opération s’est terminée de manière asynchrone, mais a échoué.
La quantité de données restante n’est pas recalculée tant que toutes les données disponibles indiquées par l’appel à WinHttpQueryDataAvailable n’ont pas été lues.
Utilisez la valeur de retour de WinHttpReadData pour déterminer quand une réponse a été entièrement lue.
Si une fonction de rappel status a été installée avec WinHttpSetStatusCallback, celles des notifications suivantes qui ont été définies dans le paramètre dwNotificationFlags de WinHttpSetStatusCallback indiquent la progression de la vérification des données disponibles :
- WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
- WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
- WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
Exemples
L’exemple suivant montre comment utiliser la sémantique de transaction sécurisée pour télécharger une ressource à partir d’un serveur HTTPS. L’exemple de code initialise l’API WinHTTP, sélectionne un serveur HTTPS cible, puis ouvre et envoie une demande pour cette ressource sécurisée.
WinHttpQueryDataAvailable est utilisé avec le handle de demande pour déterminer la quantité de données disponibles en téléchargement, puis WinHttpReadData est utilisé pour lire ces données. Ce processus se répète jusqu’à ce que l’intégralité du document ait été récupérée et affichée.
Important
Si vous souhaitez obtenir des données aussi rapidement que possible (c’est-à-dire que vous traitez et analysez les données au fur et à mesure de leur réception), vous devez appeler WinHttpQueryDataAvailable et WinHttpReadData. Si vous essayez de télécharger l’ensemble de la réponse le plus rapidement possible, appelez WinHttpReadData directement, car WinHttpReadData tente de remplir votre mémoire tampon avant de terminer.
En outre, l’exemple de code ci-dessous alloue à chaque itération de boucle. Pour le code de production, où les performances sont importantes, vous pouvez commencer par une mémoire tampon de taille appropriée (peut-être 1 mégaoctet) et la redimensionner si nécessaire. En pratique, WinHttpQueryDataAvailable ne retourne pas plus de 8 kilo-octets.
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);
Configuration requise
Client minimal pris en charge | Windows XP, Windows 2000 Professionnel avec SP3 [applications de bureau uniquement] |
Serveur minimal pris en charge | Windows Server 2003, Windows 2000 Server avec SP3 [applications de bureau uniquement] |
Plateforme cible | Windows |
En-tête | winhttp.h |
Bibliothèque | Winhttp.lib |
DLL | Winhttp.dll |
Composant redistribuable | WinHTTP 5.0 et Internet Explorer 5.01 ou version ultérieure sur Windows XP et Windows 2000. |