| 292 | } |
| 293 | |
| 294 | void ProxyManager::SetGlobalProxySettings() { |
| 295 | LOG(TRACE) << "ProxyManager::SetGlobalProxySettings"; |
| 296 | std::wstring proxy_settings_string = this->BuildProxySettingsString(); |
| 297 | |
| 298 | std::vector<std::wstring> proxy_settings; |
| 299 | StringUtilities::Split(proxy_settings_string, |
| 300 | _TEXT(BYPASS_PROXY_MARKER), |
| 301 | &proxy_settings); |
| 302 | |
| 303 | std::wstring proxy = proxy_settings[0]; |
| 304 | std::wstring proxy_bypass = L""; |
| 305 | if (proxy_settings.size() > 1) { |
| 306 | proxy_bypass = proxy_settings[1]; |
| 307 | } |
| 308 | |
| 309 | INTERNET_PER_CONN_OPTION_LIST option_list; |
| 310 | unsigned long list_size = sizeof(INTERNET_PER_CONN_OPTION_LIST); |
| 311 | option_list.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST); |
| 312 | |
| 313 | INTERNET_PER_CONN_OPTION proxy_options[3]; |
| 314 | if (this->proxy_type_ == WD_PROXY_TYPE_DIRECT) { |
| 315 | proxy_options[0].dwOption = INTERNET_PER_CONN_FLAGS; |
| 316 | proxy_options[0].Value.dwValue = PROXY_TYPE_DIRECT; |
| 317 | option_list.dwOptionCount = 1; |
| 318 | } else if (this->proxy_type_ == WD_PROXY_TYPE_AUTOCONFIGURE) { |
| 319 | proxy_options[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL; |
| 320 | proxy_options[0].Value.pszValue = const_cast<wchar_t*>(proxy.c_str()); |
| 321 | proxy_options[1].dwOption = INTERNET_PER_CONN_FLAGS; |
| 322 | proxy_options[1].Value.dwValue = PROXY_TYPE_AUTO_PROXY_URL; |
| 323 | option_list.dwOptionCount = 2; |
| 324 | } else if (this->proxy_type_ == WD_PROXY_TYPE_AUTODETECT) { |
| 325 | proxy_options[0].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS; |
| 326 | proxy_options[0].Value.dwValue = AUTO_PROXY_FLAG_ALWAYS_DETECT; |
| 327 | proxy_options[1].dwOption = INTERNET_PER_CONN_FLAGS; |
| 328 | proxy_options[1].Value.dwValue = PROXY_TYPE_AUTO_DETECT; |
| 329 | option_list.dwOptionCount = 2; |
| 330 | } else { |
| 331 | proxy_options[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; |
| 332 | proxy_options[0].Value.pszValue = const_cast<wchar_t*>(proxy.c_str()); |
| 333 | proxy_options[1].dwOption = INTERNET_PER_CONN_FLAGS; |
| 334 | proxy_options[1].Value.dwValue = PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT; |
| 335 | proxy_options[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; |
| 336 | proxy_options[2].Value.pszValue = const_cast<wchar_t*>(proxy_bypass.c_str());; |
| 337 | option_list.dwOptionCount = 3; |
| 338 | } |
| 339 | |
| 340 | option_list.pOptions = proxy_options; |
| 341 | option_list.pszConnection = NULL; |
| 342 | option_list.dwOptionError = 0; |
| 343 | BOOL success = ::InternetSetOption(NULL, |
| 344 | INTERNET_OPTION_PER_CONNECTION_OPTION, |
| 345 | &option_list, |
| 346 | list_size); |
| 347 | if (!success) { |
| 348 | LOGERR(WARN) << "InternetSetOption failed setting INTERNET_OPTION_PER_CONNECTION_OPTION"; |
| 349 | } |
| 350 | |
| 351 | // Only set proxy authentication for SOCKS proxies, and |
no test coverage detected