HTTP ヘッダーの取得

このチュートリアルでは、HTTP 要求からヘッダー情報を取得する方法について説明します。

実装手順

ヘッダー情報を取得するには、次の 2 つの方法があります。

  • アプリケーションに必要な HTTP ヘッダーに関連付けられている クエリ情報フラグ 定数のいずれかを使用します。
  • HTTP_QUERY_CUSTOM属性フラグを使用し、HTTP ヘッダーの名前を渡します。

アプリケーションで必要な HTTP ヘッダーに関連付けられている定数を内部で使用する方が高速ですが、それらに定数が関連付けられていない HTTP ヘッダーが存在する可能性があります。 このような場合は、HTTP_QUERY_CUSTOM属性フラグを使用するメソッドを使用できます。

どちらのメソッドも HttpQueryInfo 関数を使用します。 HttpQueryInfo は、HTTP 要求が行われた HINTERNET ハンドル、1 つの属性、バッファー、バッファー サイズを含む DWORD 値、およびインデックス値を受け取ります。 HttpQueryInfo に渡される属性に修飾子を追加して、データを返す形式を示すこともできます。

定数を使用したヘッダーの取得

HttpQueryInfo 関数を使用して定数を使用して HTTP ヘッダーを取得するには、次の手順に従います。

  1. 属性リストの定数、NULL バッファー、およびバッファー サイズを 0 に設定した変数を使用して HttpQueryInfo を呼び出します。 また、アプリケーションで特定の形式のデータが必要な場合は、[ 修飾子] リストから定数を追加できます。
  2. 要求された HTTP ヘッダーが存在する場合、 HttpQueryInfo の呼び出しは失敗し、 GetLastError はERROR_INSUFFICIENT_BUFFERを返し、 lpdwBufferLength パラメーターに渡される変数は必要なバイト数に設定する必要があります。
  3. 必要なバイト数でバッファーを割り当てます。
  4. HttpQueryInfo の呼び出しを再試行します。

次の例では、HTTP_QUERY_RAW_HEADERS_CRLF 定数を使用した HttpQueryInfo の呼び出しを示します。これは、返されるすべての HTTP ヘッダーを要求する特殊な値です。

// 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;
}

HTTP_QUERY_CUSTOMを使用したヘッダーの取得

httpQueryInfo 関数を使用して、HTTP_QUERY_CUSTOMを使用して HTTP ヘッダーを取得するには、次の手順に従います。

  1. HTTP ヘッダーの文字列名を保持するのに十分な大きさのバッファーを割り当てます。
  2. HTTP ヘッダーの文字列名をバッファーに書き込みます。
  3. httpQueryInfo は、HTTP_QUERY_CUSTOM、HTTP ヘッダーの文字列名を含むバッファー、およびバッファー サイズを保持する変数を使用して呼び出します。 また、アプリケーションで特定の形式のデータが必要な場合は、[ 修飾子] リストから定数を追加できます。
  4. HttpQueryInfo の呼び出しが失敗し、GetLastError がERROR_INSUFFICIENT_BUFFERを返す場合は、必要なバイト数でバッファーを再割り当てします。
  5. HTTP ヘッダーの文字列名をもう一度バッファーに書き込みます。
  6. HttpQueryInfo の呼び出しを再試行します。

次の例では、HTTP_QUERY_CUSTOM定数を使用して Content-Type HTTP ヘッダーを要求する HttpQueryInfo の呼び出しを示します。

// 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;
}

Note

WinINet では、サーバーの実装はサポートされていません。 また、サービスから使用しないでください。 サーバーの実装またはサービスの場合は、Microsoft Windows HTTP サービス (WinHTTP) を使用します。