我正在使用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)的原型,
特别是参数dwAccessType
,pwszProxyName
和pwszProxyBypass
,看起来这是必须告知代理的函数。
如何告诉WinHttpOpen()
函数发送HTTP请求的代理是(IP = W.X.Y.Z, PORT = 1234)
?
结构WINHTTP_PROXY_INFO
(https://msdn.microsoft.com/en-us/library/windows/desktop/aa383912%28v=vs.85%29.aspx)看起来很有趣,但我知道如何将其与WinHttpOpen()
结合使用。
谢谢。
答案 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),并且应该拥有所需的身份验证类型。后续请求可以使用所需的身份验证方案。