#include <windows.h>
#include <winhttp.h>
#include <stdio.h>
#pragma comment(lib, "winhttp.lib")
int main()
{
static BOOL bRet = FALSE;
TCHAR szHostName[MAX_PATH] = L"www.google.com";
HINTERNET hSession = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;
const TCHAR BROWSER_INFO[] = L"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 1.1.4322; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
const WCHAR *WWIZHTTP_TYPES[] = { L"Accept: image/gif", L"image/x-xbitmap", L"image/jpeg", L"image/pjpeg", L"application/x-shockwave-flash", L"application/x-ms-application", L"application/x-ms-xbap", L"application/vnd.ms-xpsdocument", L"application/xaml+xml", L"application/msword", L"application/vnd.ms-excel", L"application/x-cabinet-win32-x86", L"application/x-pe-win32-x86", L"application/octet-stream", L"application/x-setupscript", L"*//*", NULL };
hSession = WinHttpOpen(BROWSER_INFO, WINHTTP_ACCESS_TYPE_NAMED_PROXY, L"172.168.1.196:808", L"<local>", 0);
if (hSession)
{
hConnect = WinHttpConnect(hSession, szHostName, INTERNET_DEFAULT_HTTP_PORT, 0);
}
if (hConnect)
{
hRequest = WinHttpOpenRequest(hConnect, L"GET", NULL, NULL, WINHTTP_NO_REFERER, WWIZHTTP_TYPES, 0);
}
if (hRequest)
{
//provide username and password
WinHttpSetCredentials(hRequest, WINHTTP_AUTH_TARGET_PROXY, WINHTTP_AUTH_SCHEME_BASIC, L"abc", L"abc", NULL);
// Send a request.
bRet = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
// End the request.
if (bRet)
bRet = WinHttpReceiveResponse(hRequest, NULL);
if (bRet)
{
DWORD dwStatusCode = 0;
DWORD dwTemp = sizeof(dwStatusCode);
WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwTemp, NULL);
if ((dwStatusCode >= HTTP_STATUS_CONTINUE) && (dwStatusCode < HTTP_STATUS_BAD_REQUEST))
{
bRet = TRUE;
}
else
{
bRet = FALSE;
}
}
if (bRet == TRUE)
MessageBox(NULL, L"HIT", L"",0);
}
return 0;
}
在上述代码中,为代理服务器设置了用户名密码后,从dwStatusCode
返回的WinHttpQueryHeaders()
返回值为407。这里
WinHttpSetCredentials()
用于提供用户名和密码,但dwStatusCode
的返回值仍然是407。
没有用户名密码,则上述代码可以按要求工作,即dwStatusCode
的返回值为200。但是,如果进行身份验证,此代码将失败。
我为此示例使用CCProxy version 8.0
。请提供适当的解决方案。
答案 0 :(得分:0)
请注意this document中的示例,如果响应了代理身份验证质询,请在每个SendRequest
之前重置那些凭据,因为代理可能会在响应后要求重新身份验证。
如果仍然无法使用,则可能需要使用WinHttpSetOption
而不是WinHttpSetCredentials
来设置代理身份验证,
例如:
if (!WinHttpSetOption(session, WINHTTP_OPTION_PROXY_USERNAME, proxy_username, proxy_username_len))
{
//do error operation.
}
if (!WinHttpSetOption(session, WINHTTP_OPTION_PROXY_PASSWORD, proxy_password, proxy_password_len))
{
//do error operation.
}