如何获得请求cookie与winhttp

How to get request cookies with winhttp?

本文关键字:winhttp cookie 请求 何获得      更新时间:2023-10-16

响应Cookie ('Set-Cookie'响应标头)获得良好,但请求Cookie ('Cookie'请求标头)我无法通过WinHttpQueryHeaders获得,即使使用WINHTTP_QUERY_FLAG_REQUEST_HEADERS:

DWORD size = 0;
BOOL re = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_COOKIE /*| WINHTTP_QUERY_FLAG_REQUEST_HEADERS*/, nullptr, nullptr, &size, nullptr);
DWORD err = GetLastError(); // re = 0 && err == ERROR_WINHTTP_HEADER_NOT_FOUND

怎么了?

应该可以:

DWORD lastError;
LPVOID lpBuffer;
DWORD dwSize = 0, dwIndex = 0;
// Call with zero size to get actual size
BOOL res = WinHttpQueryHeaders(hRequest,
        WINHTTP_QUERY_COOKIE,
        WINHTTP_HEADER_NAME_BY_INDEX,
        NULL,
        &dwSize,
        &dwIndex);
lastError = GetLastError();
if (lastError == ERROR_INSUFFICIENT_BUFFER)
{
    lpBuffer = new WCHAR[dwSize/sizeof(WCHAR)];
    WinHttpQueryHeaders(hRequest,
        WINHTTP_QUERY_COOKIE,
        WINHTTP_HEADER_NAME_BY_INDEX,
        lpBuffer,
        &dwSize,
        &dwIndex);
    // convert result to wstring
    std::wstring result(reinterpret_cast<wchar_t*>(lpBuffer),
        dwSize/sizeof(wchar_t));
    std::wcout << L"Result: " << result << endl;
    delete[] lpBuffer;
}

我能够通过使用(WINHTTP_QUERY_FLAG_REQUEST_HEADERS|WINHTTP_QUERY_RAW_HEADERS_CRLF)组合来检索请求标头(包括cookie),而不是仅仅使用WINHTTP_QUERY_RAW_HEADERS_CRLF作为响应标头。