Implements a Proxy detection (WPAD) interface for Linux, Mac OSX and Windows. Offers a GUI for manual proxy settings and automatic WPAD detection. The GUI is based on QT.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

88 lines
3.4 KiB

/*! @file
@id $Id$
*/
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
#ifndef PROXY_WINDOZE_HXX
#define PROXY_WINDOZE_HXX
#include <windows.h>
#include <winhttp.h>
#include <iostream> // debug
namespace proxy {
class Windoze: public Interface {
public:
Windoze() {}
virtual ~Windoze() {}
//! Implemented using M$ WinHTTP
virtual List proxies(const std::string& url) {
List res;
WINHTTP_PROXY_INFO proxyInfo;
ZeroMemory(&proxyInfo, sizeof(proxyInfo));
HINTERNET hHttpSession(WinHttpOpen(L"WinHTTP AutoProxy/1.0",
WINHTTP_ACCESS_TYPE_NO_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
0));
try {
if (!hHttpSession) throw exc::error();
WINHTTP_AUTOPROXY_OPTIONS AutoProxyOptions;
ZeroMemory(&AutoProxyOptions, sizeof(AutoProxyOptions));
AutoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
AutoProxyOptions.dwAutoDetectFlags =
WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A;
AutoProxyOptions.fAutoLogonIfChallenged = FALSE;
if (!WinHttpGetProxyForUrl(hHttpSession,
std::wstring(url.begin(), url.end()).data(),
&AutoProxyOptions, &proxyInfo))
throw exc::error();
std::wstring list(proxyInfo.lpszProxy);
std::wcout<<"LIST=\""<<list<<"\""<<std::endl;
for (std::wstring::size_type oldpos(0), pos(0);
(pos=list.find(L";", oldpos)), oldpos!=std::wstring::npos;
oldpos=(pos!=std::wstring::npos?pos+1:pos)) {
std::wstring proxy(list.substr(oldpos, pos-oldpos));
std::wstring port((oldpos=proxy.rfind(L":"))!=std::wstring::npos
?proxy.substr(oldpos+1):std::wstring());
std::wstring host(proxy.substr(0, proxy.rfind(L":")));
Type type(DIRECT);
switch (proxyInfo.dwAccessType) { //! @todo use or remove
case WINHTTP_ACCESS_TYPE_NO_PROXY: type=DIRECT; break;
case WINHTTP_ACCESS_TYPE_DEFAULT_PROXY: type=DEFAULT; break;
case WINHTTP_ACCESS_TYPE_NAMED_PROXY: type=HTTP; break;
}
if (host.size()>0)
res.push_back(Proxy(type,
std::string(host.begin(), host.end()),
std::string(port.begin(), port.end())));
}
if (!res.size()) res.push_back(Proxy());
if (proxyInfo.lpszProxy) GlobalFree(proxyInfo.lpszProxy);
if (proxyInfo.lpszProxyBypass) GlobalFree(proxyInfo.lpszProxyBypass);
if (hHttpSession) WinHttpCloseHandle(hHttpSession);
} catch (...) {
if (proxyInfo.lpszProxy) GlobalFree(proxyInfo.lpszProxy);
if (proxyInfo.lpszProxyBypass) GlobalFree(proxyInfo.lpszProxyBypass);
if (hHttpSession) WinHttpCloseHandle(hHttpSession);
if (!res.size()) res.push_back(Proxy()); // try direct acces
}
return res;
}
};
}
#endif