Files
Leviathan/Library/Internal/source/internet/XHttpResponseHeader.cpp
T
2026-06-01 12:46:52 +02:00

150 lines
3.0 KiB
C++

#include "../../include/internet/XHttpResponseHeader.h"
XHttpResponseHeader::XHttpResponseHeader( HINTERNET hRequest )
: m_hRequest( hRequest )
{
}
XHttpResponseHeader::~XHttpResponseHeader()
{
m_hRequest = NULL;
}
DWORD XHttpResponseHeader::StatusCode() const
{
DWORD dwCode = 0;
DWORD dwCodeSize = sizeof( dwCode );
::WinHttpQueryHeaders(
m_hRequest,
WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,
WINHTTP_HEADER_NAME_BY_INDEX,
&dwCode,
&dwCodeSize,
WINHTTP_NO_HEADER_INDEX );
return dwCode;
}
std::wstring XHttpResponseHeader::ContentType() const
{
std::wstring strContentType;
DWORD dwContentTypeSize = 0;
if( ::WinHttpQueryHeaders(
m_hRequest,
WINHTTP_QUERY_CONTENT_TYPE,
WINHTTP_HEADER_NAME_BY_INDEX,
NULL,
&dwContentTypeSize,
WINHTTP_NO_HEADER_INDEX )
== FALSE )
{
if( ::GetLastError() == ERROR_INSUFFICIENT_BUFFER )
{
size_t nContentTypeLen = dwContentTypeSize / sizeof( wchar_t );
wchar_t* temp = new wchar_t[nContentTypeLen];
if( ::WinHttpQueryHeaders(
m_hRequest,
WINHTTP_QUERY_CONTENT_TYPE,
WINHTTP_HEADER_NAME_BY_INDEX,
temp,
&dwContentTypeSize,
WINHTTP_NO_HEADER_INDEX )
!= FALSE )
{
temp[dwContentTypeSize/sizeof( wchar_t )] = L'\0';
strContentType = temp;
}
delete [] temp;
}
}
return strContentType;
}
size_t XHttpResponseHeader::ContentLength() const
{
wchar_t szContentLen[64] = { 0, };
DWORD dwContentLenSize = sizeof( szContentLen );
if( ::WinHttpQueryHeaders(
m_hRequest,
WINHTTP_QUERY_CONTENT_LENGTH,
WINHTTP_HEADER_NAME_BY_INDEX,
szContentLen,
&dwContentLenSize,
WINHTTP_NO_HEADER_INDEX )
!= FALSE )
{
szContentLen[dwContentLenSize/sizeof( szContentLen[0] )] = L'\0';
unsigned long long n64ContentSize = ::_wcstoui64( szContentLen, NULL, 10 );
return size_t( n64ContentSize );
}
return 0;
}
SYSTEMTIME XHttpResponseHeader::ModifiedTime() const
{
SYSTEMTIME modified;
DWORD dwSystemTimeSize = sizeof( modified );
if( ::WinHttpQueryHeaders(
m_hRequest,
WINHTTP_QUERY_LAST_MODIFIED | WINHTTP_QUERY_FLAG_SYSTEMTIME,
WINHTTP_HEADER_NAME_BY_INDEX,
&modified,
&dwSystemTimeSize,
WINHTTP_NO_HEADER_INDEX )
== FALSE )
{
::GetSystemTime( &modified );
}
return modified;
}
std::wstring XHttpResponseHeader::Get() const
{
std::wstring strHeader;
DWORD dwHeaderSize = 0;
if( ::WinHttpQueryHeaders(
m_hRequest,
WINHTTP_QUERY_RAW_HEADERS_CRLF,
WINHTTP_HEADER_NAME_BY_INDEX,
NULL,
&dwHeaderSize,
WINHTTP_NO_HEADER_INDEX )
== FALSE )
{
if( ::GetLastError() == ERROR_INSUFFICIENT_BUFFER )
{
size_t nHeaderLen = dwHeaderSize / sizeof( wchar_t );
wchar_t* temp = new wchar_t[nHeaderLen];
if( ::WinHttpQueryHeaders(
m_hRequest,
WINHTTP_QUERY_RAW_HEADERS_CRLF,
WINHTTP_HEADER_NAME_BY_INDEX,
temp,
&dwHeaderSize,
WINHTTP_NO_HEADER_INDEX )
!= FALSE )
{
temp[dwHeaderSize/sizeof( wchar_t )] = L'\0';
strHeader = temp;
}
delete [] temp;
}
}
return strHeader;
}