簡體   English   中英

WinHTTP中WINHTTP_QUERY_URI的目的?

[英]Purpose of WINHTTP_QUERY_URI in WinHTTP?

可以使用帶有WinHttpQueryHeaders函數的WINHTTP_QUERY_URI標志確切地查詢哪些HTTP標頭? 在閱讀了它的描述之后,我印象很深,這個標志應該被用來獲取WinHttpOpenRequest函數中指定的請求的URI。 但是下面的程序給我一個錯誤代碼12019 ERROR_INTERNET_INCORRECT_HANDLE_STATE (如果我取消注釋兩條注釋行, ERROR_HTTP_HEADER_NOT_FOUND 12150 ERROR_HTTP_HEADER_NOT_FOUND )。

#include <cstdio>
#include <windows.h>
#include <winhttp.h>
#pragma comment(lib, "winhttp.lib")
int main()
{
    HINTERNET hSession = WinHttpOpen(nullptr, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
    HINTERNET hConnect = WinHttpConnect(hSession, L"www.ietf.org", INTERNET_DEFAULT_HTTP_PORT, 0);
    HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/rfc/rfc2616.txt", nullptr, WINHTTP_NO_REFERER, nullptr, 0);

    //WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
    //WinHttpReceiveResponse(hRequest, 0);

    wchar_t url[1024] = {};
    DWORD url_size = sizeof(url);
    auto success = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_URI, WINHTTP_HEADER_NAME_BY_INDEX, url, &url_size, WINHTTP_NO_HEADER_INDEX);
    auto error_code = GetLastError();
    wprintf(L"success=%d error_code=%u url=%s", success, error_code, url);

    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);
}

PS是的,我知道我可以使用WinHttpQueryOptionWINHTTP_OPTION_URL獲取請求URI,無需指出。

編輯。 添加WINHTTP_QUERY_FLAG_REQUEST_HEADERS標志按Obvlious船長回答以下(這完全有道理的,如果 WINHTTP_QUERY_URI確實應該返回請求的URI)沒有太大的差別:現在有或無WinHttpSendRequestWinHttpReceiveResponse調用WinHttpQueryHeaders功能產生錯誤代碼12150 ERROR_HTTP_HEADER_NOT_FOUND

您正在查詢不包含URI的請求的響應標頭。 您需要包括WINHTTP_QUERY_FLAG_REQUEST_HEADERS修飾符標志才能從請求標頭中檢索。

WinHttpQueryHeaders(
    hRequest,
    WINHTTP_QUERY_URI | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
    WINHTTP_HEADER_NAME_BY_INDEX,
    url,
    &url_size,
    WINHTTP_NO_HEADER_INDEX);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM