Récupération des en-têtes HTTP

Ce tutoriel explique comment récupérer des informations d’en-tête à partir de requêtes HTTP.

Étapes d’implémentation

Il existe deux façons de récupérer les informations d’en-tête :

  • Utilisez l’une des constantes d’indicateur d’informations de requête associées à l’en-tête HTTP dont votre application a besoin.
  • Utilisez l’indicateur d’attribut HTTP_QUERY_CUSTOM et transmettez le nom de l’en-tête HTTP.

L’utilisation de la constante associée à l’en-tête HTTP dont votre application a besoin est plus rapide en interne, mais il peut y avoir des en-têtes HTTP qui n’ont pas de constante associée. Dans ce cas, la méthode utilisant l’indicateur d’attribut HTTP_QUERY_CUSTOM est disponible.

Les deux méthodes utilisent la fonction HttpQueryInfo . HttpQueryInfo prend le handle HINTERNET sur lequel la requête HTTP a été effectuée, un attribut, une mémoire tampon, une valeur DWORD qui contient la taille de la mémoire tampon et une valeur d’index. Un modificateur peut également être ajouté à l’attribut passé à HttpQueryInfo pour indiquer dans quel format les données doivent être retournées.

Récupération d’en-têtes à l’aide d’une constante

Pour utiliser la fonction HttpQueryInfo pour récupérer un en-tête HTTP à l’aide d’une constante, procédez comme suit :

  1. Appelez HttpQueryInfo avec une constante de la liste Attributs , une mémoire tampon NULL et la variable qui contient la taille de la mémoire tampon définie sur zéro. En outre, si votre application a besoin des données dans un format particulier, vous pouvez ajouter une constante à partir de la liste Des modificateurs .
  2. Si l’en-tête HTTP demandé existe, l’appel à HttpQueryInfo doit échouer, GetLastError doit retourner ERROR_INSUFFICIENT_BUFFER et la variable passée pour le paramètre lpdwBufferLength doit être définie sur le nombre d’octets requis.
  3. Allouez une mémoire tampon avec le nombre d’octets requis.
  4. Réessayez l’appel à HttpQueryInfo.

L’exemple suivant illustre un appel à HttpQueryInfo à l’aide de la constante HTTP_QUERY_RAW_HEADERS_CRLF, qui est une valeur spéciale qui demande tous les en-têtes HTTP retournés.

// Retrieving Headers Using a Constant
BOOL SampleCodeOne(HINTERNET hHttp)
{
   LPVOID lpOutBuffer=NULL;
   DWORD dwSize = 0;

retry:

   // This call will fail on the first pass, because
   // no buffer is allocated.
   if(!HttpQueryInfo(hHttp,HTTP_QUERY_RAW_HEADERS_CRLF,
      (LPVOID)lpOutBuffer,&dwSize,NULL))
   {
      if (GetLastError()==ERROR_HTTP_HEADER_NOT_FOUND)
      {
         // Code to handle the case where the header isn't available.
         return TRUE;
      }
      else
      {
        // Check for an insufficient buffer.
        if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
        {
            // Allocate the necessary buffer.
            lpOutBuffer = new char[dwSize];

            // Retry the call.
            goto retry;
        }
        else
        {
            // Error handling code.
            if (lpOutBuffer)
            {
               delete [] lpOutBuffer;
            }
            return FALSE;
        }
      }
   }

   if (lpOutBuffer)
   {
      delete [] lpOutBuffer;
   }

   return TRUE;
}

Récupération d’en-têtes à l’aide de HTTP_QUERY_CUSTOM

Pour utiliser la fonction HttpQueryInfo afin de récupérer un en-tête HTTP à l’aide de HTTP_QUERY_CUSTOM, procédez comme suit :

  1. Allouez une mémoire tampon suffisamment grande pour contenir le nom de chaîne de l’en-tête HTTP.
  2. Écrivez le nom de chaîne de l’en-tête HTTP dans la mémoire tampon.
  3. Appelez HttpQueryInfo avec HTTP_QUERY_CUSTOM, la mémoire tampon qui contient le nom de chaîne de l’en-tête HTTP et la variable qui contient la taille de la mémoire tampon. En outre, si votre application a besoin des données dans un format particulier, vous pouvez ajouter une constante à partir de la liste Des modificateurs .
  4. Si l’appel à HttpQueryInfo échoue et que GetLastError retourne ERROR_INSUFFICIENT_BUFFER, réallouez une mémoire tampon avec le nombre d’octets requis.
  5. Réécrivez le nom de chaîne de l’en-tête HTTP dans la mémoire tampon.
  6. Réessayez l’appel à HttpQueryInfo.

L’exemple suivant illustre un appel à HttpQueryInfo à l’aide de la constante HTTP_QUERY_CUSTOM pour demander l’en-tête HTTP Content-Type.

// Retrieving Headers Using HTTP_QUERY_CUSTOM
BOOL SampleCodeTwo(HINTERNET hHttp)
{
    DWORD dwSize = 20;
    LPVOID lpOutBuffer = new char[dwSize];

    StringCchPrintfA((LPSTR)lpOutBuffer,dwSize,"Content-Type");

retry:

    if(!HttpQueryInfo(hHttp,HTTP_QUERY_CUSTOM,
        (LPVOID)lpOutBuffer,&dwSize,NULL))
    {
        if (GetLastError()==ERROR_HTTP_HEADER_NOT_FOUND)
        {
            // Code to handle the case where the header isn't available.
            delete [] lpOutBuffer;
            return TRUE;
        }
        else
        {
            // Check for an insufficient buffer.
            if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
            {
                // Allocate the necessary buffer.
                delete [] lpOutBuffer;
                lpOutBuffer = new char[dwSize];

                // Rewrite the header name in the buffer.
                StringCchPrintfA((LPSTR)lpOutBuffer,
                                 dwSize,"Content-Type");

                // Retry the call.
                goto retry;
            }
            else
            {
                // Error handling code.
                delete [] lpOutBuffer;
                return FALSE;
            }
        }
    }

   return TRUE;
}

Notes

WinINet ne prend pas en charge les implémentations de serveur. En outre, il ne doit pas être utilisé à partir d’un service. Pour les implémentations de serveur ou les services, utilisez Microsoft Windows HTTP Services (WinHTTP).