如何使用 WinINet 通过代理连接到 HTTPS

Posted

技术标签:

【中文标题】如何使用 WinINet 通过代理连接到 HTTPS【英文标题】:How to connect to HTTPS via proxy with WinINet 【发布时间】:2015-03-13 12:16:09 【问题描述】:

我正在尝试使用 WinINet 通过代理连接到 HTTPS 服务。我的代码如下所示:

hInternet = InternetOpenW(L"Test", INTERNET_OPEN_TYPE_PROXY,L"PROXY_IP:PROXY_PORT", L"<local>", 0);

if (hInternet == NULL)

    printf("InternetOpenW failed! Error code: %d\n", GetLastError());

else

    HINTERNET hConnect = InternetConnectW(hInternet, L"HTTPS_SERVICE_IP", 443, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
    if (hConnect == NULL)
    
        printf("InternetConnectW failed! Error code: %d\n", GetLastError());
    
    else
    
        HINTERNET hRequest = HttpOpenRequestW(hConnect, NULL, L"", NULL, NULL, NULL, 0, 0);
        if (hRequest == NULL)
        
            printf("HttpOpenRequestW failed! Error code: %d\n", GetLastError());
        
        else
        
            BOOL bRequestSent = HttpSendRequestW(hRequest, NULL, 0, NULL, 0);
            if (!bRequestSent)
            
                printf("HttpSendRequestW failed! Error code: %d\n", GetLastError());
            
            else
            
                printf("Connection ok!\n");
            

            InternetCloseHandle(hRequest);
        

        InternetCloseHandle(hConnect);
    

    InternetCloseHandle(hInternet);

向代理发送GET请求,进行ntml认证,但连接失败。代理期望客户端发送 CONNECT 请求。如何使用该代码发送 CONNECT 方法?

【问题讨论】:

【参考方案1】:

您需要在您的HttpOpenRequestW 调用中添加INTERNET_FLAG_SECURE 标志,例如这里:

HINTERNET hRequest = HttpOpenRequestW(hConnect, NULL, L"", NULL, NULL, NULL, INTERNET_FLAG_SECURE, 0);

显然,您这边的应用程序代码需要识别您是在处理 HTTP 还是 HTTPs,并且仅在需要时添加此标志。

【讨论】:

以上是关于如何使用 WinINet 通过代理连接到 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WinINet 查找网页是不是存在

连接到互联网?

通过http代理连接到FTP服务器

德尔福。 WinInet + 思科 + NTLM。 12045 和 12057 错误

如何使用 http 代理连接到 https 网络?

如何使用代理从 Cosmos SDK .Net 连接到 Azure Cosmos?