int _getProxyAddress() { #if defined OS_WIN32 && defined CC_MSVC long ret; HKEY result; char url[1024]; DWORD size = 1024; char TempPath[MAX_PATH]; char TempFile[MAX_PATH]; HMODULE hModJS; DWORD enable; DWORD enablesize = sizeof(DWORD); /* MSDN EXAMPLE */ char url1[1025] = "http://www.google.fr/about.html"; char host[256] = "http://www.google.fr"; char proxyBuffer[1024]; char * proxy = proxyBuffer; ZeroMemory(proxy, 1024); DWORD dwProxyHostNameLength = 1024; DWORD returnVal; // Declare function pointers for the three autoproxy functions pfnInternetInitializeAutoProxyDll pInternetInitializeAutoProxyDll; pfnInternetDeInitializeAutoProxyDll pInternetDeInitializeAutoProxyDll; pfnInternetGetProxyInfo pInternetGetProxyInfo; /* ************ */ ret = RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", 0, KEY_QUERY_VALUE, & result); ret = RegQueryValueExA(result, "ProxyEnable", 0, 0, (LPBYTE) & enable, & enablesize); ret = RegQueryValueExA(result, "ProxyServer", 0, 0, (LPBYTE)url, & size); if (ret == ERROR_SUCCESS && enable == 1) { if (_parseProxyUrl(url) == 0) { RegCloseKey(result); return 0; } } ZeroMemory(url, 1024); size = 1024; ret = RegQueryValueExA(result, "AutoConfigURL", 0, 0, (LPBYTE)url, & size); RegCloseKey(result); if (ret != ERROR_SUCCESS) { if (DetectAutoProxyUrl(url, size, PROXY_AUTO_DETECT_TYPE_DHCP | PROXY_AUTO_DETECT_TYPE_DNS_A) == false) { NETLIB_LOG_ERROR(make_error_string("_getProxyAddress : DetectAutoProxyUrl")); return -1; } } GetTempPathA(sizeof(TempPath), TempPath); GetTempFileNameA(TempPath, NULL, 0, TempFile); if (URLDownloadToFileA(NULL, url, TempFile, NULL, NULL) != S_OK) { NETLIB_LOG_ERROR(make_error_string("_getProxyAddress : URLDownloadToFileA")); return -1; } if (!(hModJS = LoadLibraryA("jsproxy.dll"))) { NETLIB_LOG_ERROR(make_error_string("_getProxyAddress : LoadLibrary")); return -1; } if (!(pInternetInitializeAutoProxyDll = (pfnInternetInitializeAutoProxyDll) GetProcAddress(hModJS, "InternetInitializeAutoProxyDll")) || !(pInternetDeInitializeAutoProxyDll = (pfnInternetDeInitializeAutoProxyDll) GetProcAddress(hModJS, "InternetDeInitializeAutoProxyDll")) || !(pInternetGetProxyInfo = (pfnInternetGetProxyInfo) GetProcAddress(hModJS, "InternetGetProxyInfo"))) { NETLIB_LOG_ERROR(make_error_string("_getProxyAddress : GetProcAddress")); return -1; } if (!(returnVal = pInternetInitializeAutoProxyDll(0, TempFile, NULL, 0, NULL))) { NETLIB_LOG_ERROR(make_error_string("_getProxyAddress : pInternetInitializeAutoProxyDll")); return -1; } DeleteFileA(TempFile); if (!pInternetGetProxyInfo((LPSTR)url1, sizeof(url1), (LPSTR)host, sizeof(host), &proxy, &dwProxyHostNameLength)) { NETLIB_LOG_ERROR(make_error_string("_getProxyAddress : pInternetGetProxyInfo")); return -1; } if (strncmp("PROXY ", proxy, 6) == 0) { if (_parseProxyUrl(proxy + 6) != 0) { NETLIB_LOG_ERROR(make_error_string("_getProxyAddress : _parseProxyUrl")); return -1; } } else { NETLIB_LOG_ERROR("_getProxyAddress : strncmp : PROXY doesn't match\n"); return -1; } if (!pInternetDeInitializeAutoProxyDll(NULL, 0)) { NETLIB_LOG_ERROR(make_error_string("_getProxyAddress : pInternetDeInitializeAutoProxyDll")); return -1; } #endif return 0; }
bool GetProxyForHost(const char *url, const char *hostname, cvs::string& proxy, cvs::string& proxy_port) { static bool bInitialised = false, bWorking = false; char WPADLocation[1024]= ""; char TempPath[MAX_PATH]; char TempFile[MAX_PATH]; DWORD dwProxyHostNameLength; DWORD returnVal; HMODULE hModJS; // Declare and populate an AutoProxyHelperVtbl structure, and then // place a pointer to it in a containing AutoProxyHelperFunctions // structure, which will be passed to InternetInitializeAutoProxyDll: // Failure to compile this line means you have an out of date platfrom SDK. static const AutoProxyHelperVtbl Vtbl = { IsResolvable, GetIPAddress, ResolveHostName, IsInNet }; static const AutoProxyHelperFunctions HelperFunctions = { &Vtbl }; // Declare function pointers for the three autoproxy functions static pfnInternetInitializeAutoProxyDll pInternetInitializeAutoProxyDll; static pfnInternetDeInitializeAutoProxyDll pInternetDeInitializeAutoProxyDll; static pfnInternetGetProxyInfo pInternetGetProxyInfo; static cvs::string static_proxy,static_port; if(!bInitialised) { bInitialised=true; bWorking=false; if( !( hModJS = LoadLibraryA( "jsproxy.dll" ) ) ) return false; if( !( pInternetInitializeAutoProxyDll = (pfnInternetInitializeAutoProxyDll) GetProcAddress( hModJS, "InternetInitializeAutoProxyDll" ) ) || !( pInternetDeInitializeAutoProxyDll = (pfnInternetDeInitializeAutoProxyDll) GetProcAddress( hModJS, "InternetDeInitializeAutoProxyDll" ) ) || !( pInternetGetProxyInfo = (pfnInternetGetProxyInfo) GetProcAddress( hModJS, "InternetGetProxyInfo" ) ) ) return false; INTERNET_PER_CONN_OPTIONA pco[] = { { INTERNET_PER_CONN_FLAGS }, { INTERNET_PER_CONN_AUTOCONFIG_URL }, { INTERNET_PER_CONN_PROXY_SERVER }, { INTERNET_PER_CONN_PROXY_BYPASS }, { INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL } }; INTERNET_PER_CONN_OPTION_LISTA pcol = { sizeof(pco), NULL, sizeof(pco)/sizeof(pco[0]), 0, pco }; DWORD dwLen=sizeof(pcol); if(!InternetQueryOptionA(NULL,INTERNET_OPTION_PER_CONNECTION_OPTION,&pcol,&dwLen)) return false; DWORD pt = pco[0].Value.dwValue; if(pt&PROXY_TYPE_AUTO_DETECT) { // Autodetect proxy file. We only want to do this once becuase it's slow // We do DNS first... DHCP can take up to 10 seconds to complete. if(!DetectAutoProxyUrl( WPADLocation, sizeof(WPADLocation),PROXY_AUTO_DETECT_TYPE_DNS_A) && !DetectAutoProxyUrl( WPADLocation, sizeof(WPADLocation), PROXY_AUTO_DETECT_TYPE_DHCP )) return false; } else if(pt&PROXY_TYPE_AUTO_PROXY_URL) { // Download proxy.pac from url strncpy(WPADLocation,pco[1].Value.pszValue,sizeof(WPADLocation)); LocalFree((HLOCAL)pco[1].Value.pszValue); } else if(pt&PROXY_TYPE_PROXY) { // Explicitly set proxy server LPSTR szValue = pco[2].Value.pszValue; static_port=""; char *p=strrchr(szValue,':'); if(p) { *p='\0'; static_port=p+1; } static_proxy=szValue; LocalFree((HLOCAL)szValue); } else { return false; // Fail the detect, forcing us to go direct } if(!static_proxy.length()) { GetTempPathA( sizeof(TempPath)/sizeof(TempPath[0]), TempPath ); GetTempFileNameA( TempPath, NULL, 0, TempFile ); URLDownloadToFileA( NULL, WPADLocation, TempFile, NULL, NULL ); if( !( returnVal = pInternetInitializeAutoProxyDll( 0, TempFile, NULL, (AutoProxyHelperFunctions*)&HelperFunctions, NULL ) ) ) return false; // Delete the temporary file DeleteFileA( TempFile ); } bWorking = true; } if(!bWorking) return false; if(static_proxy.length()) { proxy = static_proxy; proxy_port = static_port; } else { dwProxyHostNameLength=0; LPSTR szProxy = NULL; if( !pInternetGetProxyInfo( (LPSTR) url, (DWORD)strlen(url), (LPSTR) hostname, (DWORD)strlen(hostname), &szProxy, &dwProxyHostNameLength ) ) return false; if(!szProxy || !strcmp(szProxy,"DIRECT")) return false; // Direct connection if(strncmp(szProxy,"PROXY ",6)) return false; // This should be the only possible string (maybe "SOCKS" but that's little used) proxy_port=""; char *p = strrchr(szProxy,':'); if(p) { proxy_port=p+1; *p='\0'; } proxy=szProxy+6; // Not documented - how to free this? LocalFree((HLOCAL)szProxy); } return true; }