diff --git a/include/WinStd/WinHTTP.h b/include/WinStd/WinHTTP.h index 5c811472..76348f4b 100644 --- a/include/WinStd/WinHTTP.h +++ b/include/WinStd/WinHTTP.h @@ -10,6 +10,53 @@ #include "Common.h" #include +#include + +/// \addtogroup WinStdWinHTTP +/// @{ + +/// +/// Retrieves header information associated with an HTTP request. +/// +/// \sa [WinHttpQueryHeaders function](https://learn.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpqueryheaders) +/// +inline _Success_(return) BOOL WinHttpQueryHeaders(_In_ HINTERNET hRequest, _In_ DWORD dwInfoLevel, _Out_ DWORD& dwData) +{ + DWORD dwSize = sizeof(dwData); + if (WinHttpQueryHeaders(hRequest, dwInfoLevel | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, &dwData, &dwSize, WINHTTP_NO_HEADER_INDEX)) { + assert(dwSize == sizeof(dwData)); + return TRUE; + } + return FALSE; +} + +/// +/// Retrieves header information associated with an HTTP request. +/// +/// \sa [WinHttpQueryHeaders function](https://learn.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpqueryheaders) +/// +inline _Success_(return) BOOL WinHttpQueryHeaders(_In_ HINTERNET hRequest, _In_ DWORD dwInfoLevel, _Inout_ std::wstring& sData) +{ + DWORD dwSize = 0x100; + for (;;) { + sData.resize(dwSize - 1); + dwSize *= sizeof(WCHAR); + if (WinHttpQueryHeaders(hRequest, dwInfoLevel, WINHTTP_HEADER_NAME_BY_INDEX, sData.data(), &dwSize, WINHTTP_NO_HEADER_INDEX)) { + dwSize /= sizeof(WCHAR); + sData.resize(dwSize); + return TRUE; + } + DWORD result = GetLastError(); + if (result == ERROR_NOT_ENOUGH_MEMORY) { + dwSize /= sizeof(WCHAR); + dwSize *= 2; + } + else + return FALSE; + } +} + +/// @} namespace winstd { @@ -50,4 +97,4 @@ namespace winstd }; /// @} -} \ No newline at end of file +}