From 9da457ab2bdb473eaeb9f94c1d3947e2413f6265 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Mon, 11 Mar 2024 21:41:51 +0100 Subject: [PATCH] WinHTTP: Add WinHttpQueryHeaders Signed-off-by: Simon Rozman --- include/WinStd/WinHTTP.h | 49 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) 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 +}