SystemProxyWin.cpp [plain text]
#include "config.h"
#include "SystemProxyWin.h"
#include <WebCore/CurlContext.h>
bool WindowsSystemProxy::getSystemHttpProxy(char* buffer, int bufferLen, int* port)
{
std::unique_ptr<TCHAR[]> tRegBuffer = std::make_unique<TCHAR[]>(bufferLen);
std::unique_ptr<TCHAR[]> tHost = std::make_unique<TCHAR[]>(bufferLen);
if (!tRegBuffer || !tHost)
return false;
DWORD type;
DWORD size;
HKEY key;
LONG ret = RegOpenKeyEx(HKEY_CURRENT_USER,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
0,
KEY_READ,
&key);
if (ret != ERROR_SUCCESS)
return false;
size = bufferLen - 1;
ret = RegQueryValueEx(key,
L"ProxyServer",
nullptr,
&type,
(LPBYTE)tRegBuffer.get(),
&size);
if (ret != ERROR_SUCCESS)
return false;
if (!parseProxyString(tRegBuffer.get(), tHost.get(), bufferLen, port))
return false;
wcstombs(buffer, tHost.get(), bufferLen);
buffer[bufferLen-1] = '\0';
return true;
}
void WindowsSystemProxy::setCurlHttpProxy(char* proxy, int port)
{
WebCore::CurlContext::singleton().setProxyInfo(proxy, port);
}
void WindowsSystemProxy::setCurlHttpProxy()
{
char proxy[ProxyServerNameLength];
int port;
if (getSystemHttpProxy(proxy, ProxyServerNameLength, &port))
setCurlHttpProxy(proxy, port);
}
bool WindowsSystemProxy::parseProxyString(const TCHAR* regProxyString, TCHAR* hostString, int hostStringLen, int* port)
{
const TCHAR* found = wcschr(regProxyString, L':');
if (!found)
return false;
int len = found - regProxyString;
if (len >= hostStringLen)
return false;
wcsncpy(hostString, regProxyString, hostStringLen);
hostString[len] = L'\0';
TCHAR* portStr = const_cast<TCHAR*>(found) + 1;
*port = _wtoi(portStr);
return true;
}