public static extern bool WinHttpGetIEProxyConfigForCurrentUser( out WINHTTP_CURRENT_USER_IE_PROXY_CONFIG proxyConfig);
public Task <WebProxy> CreateProxyAsync(Uri destination) { var ieProxy = new WINHTTP_CURRENT_USER_IE_PROXY_CONFIG(); var success = WinHttpGetIEProxyConfigForCurrentUser(out ieProxy); if (success && ieProxy.Proxy != IntPtr.Zero) { var proxyUrl = Marshal.PtrToStringUni(ieProxy.Proxy); var bypassList = Marshal.PtrToStringUni(ieProxy.ProxyBypass)?.Split(';', ' ', '\t', '\r', '\n'); return(Task.FromResult(new WebProxy(new Uri($"http://{proxyUrl}"), bypassList?.Contains("<local>") ?? false, bypassList))); } var session = WinHttpOpen(null, WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (session.IsInvalid) { WriteLog.To.Sync.W(Tag, $"Unable to open WinHttp session to query for proxy (error code: {Marshal.GetLastWin32Error()})"); return(Task.FromResult <WebProxy>(null)); } var options = new WINHTTP_AUTOPROXY_OPTIONS { AutoConfigUrl = null, AutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A, AutoLoginIfChallenged = false, Flags = WINHTTP_AUTOPROXY_AUTO_DETECT, Reserved1 = IntPtr.Zero, Reserved2 = 0 }; var info = new WINHTTP_PROXY_INFO { AccessType = 0, Proxy = IntPtr.Zero, ProxyBypass = IntPtr.Zero }; success = WinHttpGetProxyForUrl(session, destination.AbsoluteUri, ref options, out info); session.Close(); if (!success) { var lastErr = Marshal.GetLastWin32Error(); if (lastErr != ERROR_WINHTTP_AUTODETECTION_FAILED) { WriteLog.To.Sync.W(Tag, $"Call to WinHttpGetProxyForUrl failed (error code: {lastErr})"); } else { WriteLog.To.Sync.W(Tag, "Call to WinHttpGetProxyForUrl failed (possible direct connection)..."); } return(Task.FromResult <WebProxy>(null)); } var url = Marshal.PtrToStringUni(info.Proxy); var bypass = Marshal.PtrToStringUni(info.ProxyBypass)?.Split(';', ' ', '\t', '\r', '\n'); return(Task.FromResult(new WebProxy(new Uri($"http://{url}"), bypass?.Contains("<local>") ?? false, bypass))); }