【问题标题】:Obtain the request headers using WinHTTP (C++)使用 WinHTTP (C++) 获取请求标头
【发布时间】:2018-02-16 09:31:40
【问题描述】:

我有一个场景,我需要查看发送到服务器的请求标头。

我尝试在 WinhttpQueryHeaders 中使用选项标志 WINHTTP_QUERY_FLAG_REQUEST_HEADERS,但收到错误 12150 (ERROR_WINHTTP_HEADER_NOT_FOUND)。

我的代码(假设 hRequest 有一个非空值):

LPVOID getRequestHeaders(HINTERNET hRequest)
{
    LPVOID tempHeaderBuffer = NULL;
    DWORD dwSize = 0;

    WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_URI | WINHTTP_QUERY_FLAG_REQUEST_HEADERS, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX);

    cout << GetLastError();

    if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    {
        tempHeaderBuffer = (LPWSTR)malloc(dwSize * sizeof(LPWSTR) + 5);

        if (!WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_URI | WINHTTP_QUERY_FLAG_REQUEST_HEADERS, WINHTTP_HEADER_NAME_BY_INDEX, tempHeaderBuffer, &dwSize, WINHTTP_NO_HEADER_INDEX))
        {
            cout << GetLastError();
        }
        else
        {
            printf("GetHTTPResponse : Header Request Contents : \n\n%S", tempHeaderBuffer);
        }
    }

    return tempHeaderBuffer;
}

我在这里做错了什么?有什么建议么?我提到了其他类似的问题,但没有解决。

【问题讨论】:

    标签: c winhttp


    【解决方案1】:

    我尝试使用 WINHTTP_QUERY_URI,但标题似乎不存在。

    以下方法有效:

    void main() {
        DWORD dwSize = 0;
        LPVOID lpOutBuffer = NULL;
        BOOL  bResults = FALSE;
        HINTERNET hSession = NULL,
            hConnect = NULL,
            hRequest = NULL;
    
        // Use WinHttpOpen to obtain a session handle.
        hSession = WinHttpOpen(L"A WinHTTP Example Program/1.0",
            WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
            WINHTTP_NO_PROXY_NAME,
            WINHTTP_NO_PROXY_BYPASS, 0);
    
        // Specify an HTTP server.
        if (hSession)
            hConnect = WinHttpConnect(hSession, L"localhost",
                INTERNET_DEFAULT_HTTP_PORT, 0);
    
        // Create an HTTP request handle.
        if (hConnect)
            hRequest = WinHttpOpenRequest(hConnect, L"GET", NULL,
                NULL, WINHTTP_NO_REFERER,
                WINHTTP_DEFAULT_ACCEPT_TYPES,
                0);
    
        // Send a request.
        if (hRequest)
            bResults = WinHttpSendRequest(hRequest,
                WINHTTP_NO_ADDITIONAL_HEADERS,
                0, WINHTTP_NO_REQUEST_DATA, 0,
                0, 0);
    
        // End the request.
        if (bResults)
            bResults = WinHttpReceiveResponse(hRequest, NULL);
    
        // First, use WinHttpQueryHeaders to obtain the size of the buffer.
        if (bResults)
        {
            WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF |  WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
                WINHTTP_HEADER_NAME_BY_INDEX, NULL,
                &dwSize, WINHTTP_NO_HEADER_INDEX);
    
            // Allocate memory for the buffer.
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                lpOutBuffer = new WCHAR[dwSize / sizeof(WCHAR)];
    
                // Now, use WinHttpQueryHeaders to retrieve the header.
                bResults = WinHttpQueryHeaders(hRequest,  WINHTTP_QUERY_RAW_HEADERS_CRLF |
                    WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
                    WINHTTP_HEADER_NAME_BY_INDEX,
                    lpOutBuffer, &dwSize,
                    WINHTTP_NO_HEADER_INDEX);
            }
        }
    
        // Print the header contents.
        if (bResults)
            printf("Header contents: \n%S", lpOutBuffer);
    
        // Free the allocated memory.
        delete[] lpOutBuffer;
    
        // Report any errors.
        if (!bResults)
            printf("Error %d has occurred.\n", GetLastError());
    
        // Close any open handles.
        if (hRequest) WinHttpCloseHandle(hRequest);
        if (hConnect) WinHttpCloseHandle(hConnect);
        if (hSession) WinHttpCloseHandle(hSession);
    }
    

    结果:

    Header contents:
    GET /dashboard/ HTTP/1.1
    User-Agent: A WinHTTP Example Program/1.0
    Connection: Keep-Alive
    

    【讨论】:

    • 太棒了!非常感谢。那个 WINHTTP_QUERY_URI 是问题所在。 :D
    猜你喜欢
    • 2011-11-10
    • 2011-01-31
    • 1970-01-01
    • 2016-03-21
    • 2013-11-16
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多