更改请求协议restsdk

时间:2018-12-22 20:02:22

标签: c++ windows request protocols cpprest-sdk

因此,我想在使用其余SDK进行请求时增加对所有协议的支持。这是Windows支持的默认协议:

  

默认情况下,在Windows 7和Windows 8中仅启用SSL3和TLS1。默认情况下,在Windows 8.1和Windows 10中仅启用SSL3,TLS1.0,TLS1.1和TLS1.2。

在创建请求之前,我设置了一个http_client_config并为set_nativehandle_options创建了一个回调,如下所示:

std::function<void(web::http::client::native_handle)> get_callback()
{
    auto func = [&](const web::http::client::native_handle handle)
    {
        std::cout << "handle: " << std::hex << handle << std::endl;
        DWORD secure_protocols = WINHTTP_FLAG_SECURE_PROTOCOL_ALL;
        if (!WinHttpSetOption(handle, WINHTTP_OPTION_SECURE_PROTOCOLS, &secure_protocols, sizeof(secure_protocols)))
        {
            std::cout << "Can not set WINHTTP_FLAG_SECURE_PROTOCOL_ALL" << std::endl;
            std::cout << std::dec << GetLastError() << std::endl;
        }
        else
            std::cout << "Set WINHTTP_FLAG_SECURE_PROTOCOL_ALL" << std::endl;
    };

    return func;
}

因此,基本上,问题在于WinHttpSetOption始终返回ERROR_INTERNET_INCORRECT_HANDLE_TYPE。不幸的是,这与this网站上的声明相反:

  

native_handle是以下类型,具体取决于基础平台:Windows桌面,WinHTTP-HINTERNET Windows运行时,WinRT-IXMLHTTPRequest2 * ....

我找到了github issue来解决此问题,但似乎从未解决过。

也许任何人都知道可能出什么问题。

2 个答案:

答案 0 :(得分:0)

好吧,好像功能已经坏了。我只是迷上了WinHttpOpen,它返回了我应该使用的句柄,并且该函数运行良好。

答案 1 :(得分:0)

这应该很好

web::http::client::http_client_config GetHttpConfig()
{
    web::http::client::http_client_config config;
    
    auto func = [&](web::http::client::native_handle handle) {
        HINTERNET hSession = WinHttpOpen(L"TestApp",
            WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
            WINHTTP_NO_PROXY_NAME,
            WINHTTP_NO_PROXY_BYPASS, 0);

        DWORD secure_protocols = WINHTTP_FLAG_SECURE_PROTOCOL_ALL;

        if (!WinHttpSetOption(hSession, WINHTTP_OPTION_SECURE_PROTOCOLS, &secure_protocols, sizeof(secure_protocols)))
        {
            std::cout << "Can not set WINHTTP_FLAG_SECURE_PROTOCOL_ALL" << std::endl;
            std::cout << std::dec << GetLastError() << std::endl;
        }
        else
        {
            std::cout << "Set WINHTTP_FLAG_SECURE_PROTOCOL_ALL" << std::endl;
            handle = hSession;
        }        
    };

    config.set_nativehandle_options(func);
    return config;
}