2

WinHttpQueryHeaders関数WINHTTP_QUERY_URIでフラグを使用して、正確にどの HTTP ヘッダーを照会できますか? その説明を読んだ後、このフラグはWinHttpOpenRequest関数で指定されたリクエストの URI を取得するために使用されるはずだったという印象を受けました。しかし、次のプログラムでは、エラー コード 12019 ( 2 つのコメント行をコメント解除すると 12150 ) が表示されます。ERROR_INTERNET_INCORRECT_HANDLE_STATEERROR_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);
}

WinHttpQueryOptionPS はい、 andを使用してリクエスト URI を取得できることはわかっWINHTTP_OPTION_URLています。指摘する必要はありません。

編集。以下のキャプテンオブブリアスの回答に従ってフラグを追加しても(実際にリクエストURIを返すことになっていた場合WINHTTP_QUERY_FLAG_REQUEST_HEADERSは完全に理にかなっています)、大きな違いはありませんでした。 WINHTTP_QUERY_URIWinHttpSendRequestWinHttpReceiveResponseWinHttpQueryHeadersERROR_HTTP_HEADER_NOT_FOUND

4

1 に答える 1