HTTP 헤더 검색
이 자습서에서는 HTTP 요청에서 헤더 정보를 검색하는 방법을 설명합니다.
구현 단계
헤더 정보를 검색하는 방법에는 두 가지가 있습니다.
- 애플리케이션에 필요한 HTTP 헤더와 연결된 쿼리 정보 플래그 상수 중 하나를 사용합니다.
- HTTP_QUERY_CUSTOM 특성 플래그를 사용하고 HTTP 헤더의 이름을 전달합니다.
애플리케이션에 필요한 HTTP 헤더와 연결된 상수를 사용하는 것이 내부적으로 더 빠르지만 연결된 상수가 없는 HTTP 헤더가 있을 수 있습니다. 이러한 경우 HTTP_QUERY_CUSTOM 특성 플래그를 사용하는 메서드를 사용할 수 있습니다.
두 메서드 모두 HttpQueryInfo 함수를 사용합니다. HttpQueryInfo 는 HTTP 요청이 이루어진 HINTERNET 핸들, 하나의 특성, 버퍼, 버퍼 크기를 포함하는 DWORD 값 및 인덱스 값을 사용합니다. HttpQueryInfo에 전달된 특성에 한정자를 추가하여 데이터를 반환해야 하는 형식을 나타낼 수도 있습니다.
상수를 사용하여 헤더 검색
HttpQueryInfo 함수를 사용하여 상수를 사용하여 HTTP 헤더를 검색하려면 다음 단계를 수행합니다.
- 특성 목록의 상수, NULL 버퍼 및 버퍼 크기를 0으로 설정한 변수를 사용하여 HttpQueryInfo를 호출합니다. 또한 애플리케이션에 특정 형식의 데이터가 필요한 경우 한정자 목록에서 상수를 추가할 수 있습니다.
- 요청된 HTTP 헤더가 있는 경우 HttpQueryInfo 에 대한 호출이 실패하고 GetLastError 가 ERROR_INSUFFICIENT_BUFFER 반환해야 하며 lpdwBufferLength 매개 변수에 대해 전달된 변수를 필요한 바이트 수로 설정해야 합니다.
- 필요한 바이트 수를 사용하여 버퍼를 할당합니다.
- 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 헤더를 검색하려면 다음 단계를 수행합니다.
- HTTP 헤더의 문자열 이름을 저장할 수 있을 만큼 큰 버퍼를 할당합니다.
- HTTP 헤더의 문자열 이름을 버퍼에 씁니다.
- HTTP_QUERY_CUSTOM, HTTP 헤더의 문자열 이름을 포함하는 버퍼 및 버퍼 크기를 보유하는 변수를 사용하여 HttpQueryInfo 를 호출합니다. 또한 애플리케이션에 특정 형식의 데이터가 필요한 경우 한정자 목록에서 상수를 추가할 수 있습니다.
- HttpQueryInfo 호출이 실패하고 GetLastError가 ERROR_INSUFFICIENT_BUFFER 반환하는 경우 필요한 바이트 수로 버퍼를 다시 할당합니다.
- HTTP 헤더의 문자열 이름을 버퍼에 다시 씁니다.
- 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;
}
참고
WinINet은 서버 구현을 지원하지 않습니다. 또한 서비스에서 사용하면 안 됩니다. 서버 구현 또는 서비스의 경우 WinHTTP(Microsoft Windows HTTP 서비스)를 사용합니다.