使用 WinHttp 通过代理发送 HTTP 请求的代码 [英] Code to send an HTTP request through a proxy using WinHttp
问题描述
我正在使用 Winhttp.lib
库将 C++ 中的 HTTP 请求发送到远程服务器.
I am using the Winhttp.lib
library to send an HTTP request in C++ to a remote server.
在客户端,HTTP 请求必须发送到 IP 为 W.X.Y.Z
且端口为 1234
的代理.
On the client side, the HTTP request has to be sent to a proxy which IP is W.X.Y.Z
and which port is 1234
.
根据函数原型 WinHttpOpen()
(https://msdn.microsoft.com/en-us/library/windows/desktop/aa384098%28v=vs.85%29.aspx),特别是参数dwAccessType
、pwszProxyName
和pwszProxyBypass
,看起来这是必须告知代理的函数.
According to the prototype of the function WinHttpOpen()
(https://msdn.microsoft.com/en-us/library/windows/desktop/aa384098%28v=vs.85%29.aspx),
in particular the parameters dwAccessType
, pwszProxyName
and pwszProxyBypass
, it looks like this is the function which has to be told about the proxy.
如何告诉 WinHttpOpen()
函数发送 HTTP 请求的代理是 (IP = W.X.Y.Z, PORT = 1234)
?
How do I tell the WinHttpOpen()
function that the proxy to send the HTTP request to is (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()
结合使用.
The structure WINHTTP_PROXY_INFO
(https://msdn.microsoft.com/en-us/library/windows/desktop/aa383912%28v=vs.85%29.aspx) looks interesting but I do know how to use it in combination with WinHttpOpen()
.
谢谢.
推荐答案
您是否尝试过带有 WINHTTP_OPTION_PROXY 标志的 WinHttpSetOption?大致如下:
Have you tried WinHttpSetOption with the WINHTTP_OPTION_PROXY flag? It would look roughly like this:
hSession = WinHttpOpen(L"WinHTTP Example/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
WINHTTP_PROXY_INFO proxy = { 0 };
proxy.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
proxy.lpszProxy = L"http://127.0.0.1:1234;http://blarg.com:4545";
if (!WinHttpSetOption(hSession, WINHTTP_OPTION_PROXY, &proxy, sizeof(proxy)))
{
wprintf(L"Unable to set proxy.\n");
}
else
{
HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", NULL, NULL,
WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
char* username = "username";
WinHttpSetOption(hRequest, WINHTTP_OPTION_PROXY_USERNAME, username, strlen(username));
WinHttpSetOption(hRequest, WINHTTP_OPTION_PROXY_PASSWORD, password, strlen(password));
[ ... ]
}
以上内容会将您的会话设置为使用两个代理... 127.0.0.1:1234 和 blarg.com:4545.如果需要,您还可以使用 https 更改方案.它将使用 WINHTTP_OPTION_PROXY_USERNAME 和 WINHTTP_OPTION_PROXY_PASSWORD 选项设置代理用户名和密码的参数.
The above would set your session to use two proxies... 127.0.0.1:1234, and blarg.com:4545. You can also change the scheme using https if you need. It would set parameters for the proxy username and password using the WINHTTP_OPTION_PROXY_USERNAME, and WINHTTP_OPTION_PROXY_PASSWORD options.
请注意,我几乎没有执行过错误检查.您通常希望确保正确设置选项等.
Please note I've performed little to no error checking. You would normally want to ensure the options were set properly, etc.
这篇关于使用 WinHttp 通过代理发送 HTTP 请求的代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!