使用WinHttp

时间:2016-01-29 10:20:57

标签: c++ proxy winhttp

我正在使用Winhttp.lib库将C ++中的HTTP请求发送到远程服务器。

在客户端,HTTP请求必须发送到IP为W.X.Y.Z且端口为1234的代理。

根据函数WinHttpOpen()https://msdn.microsoft.com/en-us/library/windows/desktop/aa384098%28v=vs.85%29.aspx)的原型, 特别是参数dwAccessTypepwszProxyNamepwszProxyBypass,看起来这是必须告知代理的函数。

如何告诉WinHttpOpen()函数发送HTTP请求的代理是(IP = W.X.Y.Z, PORT = 1234)

结构WINHTTP_PROXY_INFOhttps://msdn.microsoft.com/en-us/library/windows/desktop/aa383912%28v=vs.85%29.aspx)看起来很有趣,但我知道如何将其与WinHttpOpen()结合使用。

谢谢。

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用WINHTTP_OPTION_PROXY标志的WinHttpSetOption?它看起来大致如下:

WARNING: File testdata\test157.dsf permissions
NT AUTHORITY\SYSTEM:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:DENY
BUILTIN\Administrators:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:DENY
BUILTIN\Administrators:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:ALLOW
NT AUTHORITY\SYSTEM:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:ALLOW
BUILTIN\Users:READ_DATA/READ_NAMED_ATTRS/EXECUTE/READ_ATTRIBUTES/READ_ACL/SYNCHRONIZE:ALLOW
NT AUTHORITY\Authenticated Users:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/SYNCHRONIZE:ALLOW

以上会将您的会话设置为使用两个代理... 127.0.0.1:1234和blarg.com:4545。如果需要,您还可以使用https更改方案。它将使用WINHTTP_OPTION_PROXY_USERNAME和WINHTTP_OPTION_PROXY_PASSWORD选项设置代理用户名和密码的参数。

请注意我执行了很少甚至没有错误检查。您通常希望确保正确设置选项等。

答案 1 :(得分:0)

您可能还会在MSDN上考虑此页面:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384100(v=vs.85).aspx

它有一个使用代理的完整示例,比我之前介绍的更安全,因为如果我正确理解API,它不会以明文形式发送用户名/密码。

他们建议在请求的句柄上使用WinHttpSetCredentials和WINHTTP_AUTH_TARGET_PROXY(而不是会话的句柄)。但是,要做到这一点,您需要为WinHttpSetCredentials提供所需的身份验证方案。 WinHttpQueryAuthSchemes可以帮助你做到这一点。

请注意,示例代码处于循环中......对页面的第一个请求可能会为您提供一个状态代码,指示您需要提供代理身份验证(407),并且应该拥有所需的身份验证类型。后续请求可以使用所需的身份验证方案。