HTTP 헤더 검색

이 자습서에서는 HTTP 요청에서 헤더 정보를 검색하는 방법을 설명합니다.

구현 단계

헤더 정보를 검색하는 방법에는 두 가지가 있습니다.

  • 애플리케이션에 필요한 HTTP 헤더와 연결된 쿼리 정보 플래그 상수 중 하나를 사용합니다.
  • HTTP_QUERY_CUSTOM 특성 플래그를 사용하고 HTTP 헤더의 이름을 전달합니다.

애플리케이션에서 필요로 하는 HTTP 헤더와 연결된 상수 사용은 내부적으로 더 빠르지만 연결된 상수가 없는 HTTP 헤더가 있을 수 있습니다. 이러한 경우 HTTP_QUERY_CUSTOM 특성 플래그를 사용하는 메서드를 사용할 수 있습니다.

두 메서드 모두 HttpQueryInfo 함수를 사용합니다. HttpQueryInfo 는 HTTP 요청이 만들어진 HINTERNET 핸들, 하나의 특성, 버퍼, 버퍼 크기를 포함하는 DWORD 값 및 인덱스 값을 사용합니다. HttpQueryInfo에 전달된 특성에 한정자를 추가하여 데이터를 반환해야 하는 형식을 나타낼 수도 있습니다.

상수로 머리글 검색

HttpQueryInfo 함수를 사용하여 상수로 HTTP 헤더를 검색하려면 다음 단계를 수행합니다.

  1. 특성 목록의 상수, NULL 버퍼 및 버퍼 크기를 0으로 설정한 변수를 사용하여 HttpQueryInfo를 호출합니다. 또한 애플리케이션에 특정 형식의 데이터가 필요한 경우 한정자 목록에서 상수를 추가할 수 있습니다.
  2. 요청된 HTTP 헤더가 있는 경우 HttpQueryInfo 에 대한 호출이 실패하고 GetLastError 가 ERROR_INSUFFICIENT_BUFFER 반환해야 하며 lpdwBufferLength 매개 변수에 전달된 변수를 필요한 바이트 수로 설정해야 합니다.
  3. 필요한 바이트 수를 사용하여 버퍼를 할당합니다.
  4. HttpQueryInfo에 대한 호출을 다시 시도합니다.

다음 샘플에서는 반환된 모든 HTTP 헤더를 요청하는 특수 값인 HTTP_QUERY_RAW_HEADERS_CRLF 상수로 HttpQueryInfo 를 호출하는 방법을 보여 줍니다.

// 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. HTTP_QUERY_CUSTOM, HTTP 헤더의 문자열 이름을 포함하는 버퍼 및 버퍼 크기를 포함하는 변수를 사용하여 HttpQueryInfo 를 호출합니다. 또한 애플리케이션에 특정 형식의 데이터가 필요한 경우 한정자 목록에서 상수를 추가할 수 있습니다.
  4. HttpQueryInfo 호출이 실패하고 GetLastError가 ERROR_INSUFFICIENT_BUFFER 반환하는 경우 필요한 바이트 수로 버퍼를 다시 할당합니다.
  5. HTTP 헤더의 문자열 이름을 버퍼에 다시 씁니다.
  6. HttpQueryInfo에 대한 호출을 다시 시도합니다.

다음 샘플에서는 HTTP_QUERY_CUSTOM 상수로 HttpQueryInfo 를 호출하여 Content-Type HTTP 헤더를 요청하는 방법을 보여 줍니다.

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

참고

WinINet은 서버 구현을 지원하지 않습니다. 또한 서비스에서 사용하면 안 됩니다. 서버 구현 또는 서비스의 경우 WinHTTP(Microsoft Windows HTTP 서비스)를 사용합니다.