コード例 #1
0
ファイル: Interop.winhttp.cs プロジェクト: noahfalk/corefx
 public static extern bool WinHttpGetIEProxyConfigForCurrentUser(
     out WINHTTP_CURRENT_USER_IE_PROXY_CONFIG proxyConfig);
コード例 #2
0
 public static extern bool WinHttpGetIEProxyConfigForCurrentUser(
     out WINHTTP_CURRENT_USER_IE_PROXY_CONFIG proxyConfig);
コード例 #3
0
        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)));
        }