首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WinHTTP (C++)获取请求头

使用WinHTTP (C++)获取请求头
EN

Stack Overflow用户
提问于 2018-02-16 09:31:40
回答 1查看 1.4K关注 0票数 1

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

使用WinhttpQueryHeaders中的选项标志WinhttpQueryHeaders,我尝试了,但是我收到了一个错误12150 (ERROR_WINHTTP_HEADER_NOT_FOUND)。

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

代码语言:javascript
复制
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;
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-16 12:21:11

我尝试过使用WINHTTP_QUERY_URI,但是头似乎不存在。

然而,以下几点起了作用:

代码语言:javascript
复制
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);
}

结果:

代码语言:javascript
复制
Header contents:
GET /dashboard/ HTTP/1.1
User-Agent: A WinHTTP Example Program/1.0
Connection: Keep-Alive
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48823702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档