示例#1
0
        private bool WinHttpGetProxyForUrl(string destination,
                                           ref UnsafeNclNativeMethods.WinHttp.WINHTTP_AUTOPROXY_OPTIONS autoProxyOptions,
                                           out string proxyListString)
        {
            proxyListString = null;

            bool success = false;

            UnsafeNclNativeMethods.WinHttp.WINHTTP_PROXY_INFO proxyInfo =
                new UnsafeNclNativeMethods.WinHttp.WINHTTP_PROXY_INFO();

            // Make sure the strings get cleaned up in a CER (thus unexpected exceptions, like
            // ThreadAbortException will not interrupt the execution of the finally block, and we'll not
            // leak resources).
            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
                success = UnsafeNclNativeMethods.WinHttp.WinHttpGetProxyForUrl(session,
                                                                               destination, ref autoProxyOptions, out proxyInfo);

                if (success)
                {
                    proxyListString = Marshal.PtrToStringUni(proxyInfo.Proxy);
                }
            }
            finally
            {
                Marshal.FreeHGlobal(proxyInfo.Proxy);
                Marshal.FreeHGlobal(proxyInfo.ProxyBypass);
            }

            return(success);
        }
示例#2
0
        private int GetProxies(Uri destination, Uri scriptLocation, out string proxyListString)
        {
            int errorCode = 0;

            proxyListString = null;

            UnsafeNclNativeMethods.WinHttp.WINHTTP_AUTOPROXY_OPTIONS autoProxyOptions =
                new UnsafeNclNativeMethods.WinHttp.WINHTTP_AUTOPROXY_OPTIONS();

            // Always try to download the PAC file without authentication. If we turn auth. on, the WinHttp
            // service will create a new session for every request (performance/memory implications).
            // Therefore we only turn auto-logon on if it is really needed.
            autoProxyOptions.AutoLogonIfChallenged = false;

            if (scriptLocation == null)
            {
                // Use auto-discovery to find the script location.
                autoProxyOptions.Flags           = UnsafeNclNativeMethods.WinHttp.AutoProxyFlags.AutoDetect;
                autoProxyOptions.AutoConfigUrl   = null;
                autoProxyOptions.AutoDetectFlags = UnsafeNclNativeMethods.WinHttp.AutoDetectType.Dhcp |
                                                   UnsafeNclNativeMethods.WinHttp.AutoDetectType.DnsA;
            }
            else
            {
                // Use the provided script location for the PAC file.
                autoProxyOptions.Flags           = UnsafeNclNativeMethods.WinHttp.AutoProxyFlags.AutoProxyConfigUrl;
                autoProxyOptions.AutoConfigUrl   = scriptLocation.ToString();
                autoProxyOptions.AutoDetectFlags = UnsafeNclNativeMethods.WinHttp.AutoDetectType.None;
            }

            if (!WinHttpGetProxyForUrl(destination.ToString(), ref autoProxyOptions, out proxyListString))
            {
                errorCode = GetLastWin32Error();

                // If the PAC file can't be downloaded because auth. was required, we check if the
                // credentials are set; if so, then we try again using auto-logon.
                // Note that by default webProxy.Credentials will be null. The user needs to set
                // <defaultProxy useDefaultCredentials="true"> in the config file, in order for
                // webProxy.Credentials to be set to DefaultNetworkCredentials.
                if ((errorCode == (int)UnsafeNclNativeMethods.WinHttp.ErrorCodes.LoginFailure) &&
                    (Engine.Credentials != null))
                {
                    // Now we need to try again, this time by enabling auto-logon.
                    autoProxyOptions.AutoLogonIfChallenged = true;

                    if (!WinHttpGetProxyForUrl(destination.ToString(), ref autoProxyOptions,
                                               out proxyListString))
                    {
                        errorCode = GetLastWin32Error();
                    }
                }

                if (Logging.On)
                {
                    Logging.PrintError(Logging.Web, SR.GetString(SR.net_log_proxy_winhttp_getproxy_failed, destination, errorCode));
                }
            }

            return(errorCode);
        }
示例#3
0
        private bool WinHttpGetProxyForUrl(string destination, ref UnsafeNclNativeMethods.WinHttp.WINHTTP_AUTOPROXY_OPTIONS autoProxyOptions, out string proxyListString)
        {
            proxyListString = null;
            bool flag = false;

            UnsafeNclNativeMethods.WinHttp.WINHTTP_PROXY_INFO proxyInfo = new UnsafeNclNativeMethods.WinHttp.WINHTTP_PROXY_INFO();
            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
                flag = UnsafeNclNativeMethods.WinHttp.WinHttpGetProxyForUrl(this.session, destination, ref autoProxyOptions, out proxyInfo);
                if (flag)
                {
                    proxyListString = Marshal.PtrToStringUni(proxyInfo.Proxy);
                }
            }
            finally
            {
                Marshal.FreeHGlobal(proxyInfo.Proxy);
                Marshal.FreeHGlobal(proxyInfo.ProxyBypass);
            }
            return(flag);
        }
示例#4
0
        private int GetProxies(Uri destination, Uri scriptLocation, out string proxyListString)
        {
            int num = 0;

            proxyListString = null;
            UnsafeNclNativeMethods.WinHttp.WINHTTP_AUTOPROXY_OPTIONS autoProxyOptions = new UnsafeNclNativeMethods.WinHttp.WINHTTP_AUTOPROXY_OPTIONS {
                AutoLogonIfChallenged = false
            };
            if (scriptLocation == null)
            {
                autoProxyOptions.Flags           = UnsafeNclNativeMethods.WinHttp.AutoProxyFlags.AutoDetect;
                autoProxyOptions.AutoConfigUrl   = null;
                autoProxyOptions.AutoDetectFlags = UnsafeNclNativeMethods.WinHttp.AutoDetectType.DnsA | UnsafeNclNativeMethods.WinHttp.AutoDetectType.Dhcp;
            }
            else
            {
                autoProxyOptions.Flags           = UnsafeNclNativeMethods.WinHttp.AutoProxyFlags.AutoProxyConfigUrl;
                autoProxyOptions.AutoConfigUrl   = scriptLocation.ToString();
                autoProxyOptions.AutoDetectFlags = UnsafeNclNativeMethods.WinHttp.AutoDetectType.None;
            }
            if (!this.WinHttpGetProxyForUrl(destination.ToString(), ref autoProxyOptions, out proxyListString))
            {
                num = GetLastWin32Error();
                if ((num == 0x2eef) && (base.Engine.Credentials != null))
                {
                    autoProxyOptions.AutoLogonIfChallenged = true;
                    if (!this.WinHttpGetProxyForUrl(destination.ToString(), ref autoProxyOptions, out proxyListString))
                    {
                        num = GetLastWin32Error();
                    }
                }
                if (Logging.On)
                {
                    Logging.PrintError(Logging.Web, SR.GetString("net_log_proxy_winhttp_getproxy_failed", new object[] { destination, num }));
                }
            }
            return(num);
        }