Пример #1
0
        private IWebProxy GetProxyInternal(Uri uri)
        {
            WebProxy result      = null;
            WebProxy systemProxy = GetSystemProxy(uri);

            if (_proxyCache.ContainsKey(systemProxy.Address))
            {
                return(_proxyCache[systemProxy.Address]);
            }

            // Try and see if we have credentials saved for the system proxy first so that we can
            // validate and see if we should use them.
            if (_credentialProvider.HasCredentials(systemProxy.Address))
            {
                WebProxy savedCredentialsProxy = GetSystemProxy(uri);
                savedCredentialsProxy.Credentials = _credentialProvider.GetCredentials(systemProxy.Address).FirstOrDefault();
                if (IsProxyValid(savedCredentialsProxy, uri))
                {
                    result = savedCredentialsProxy;
                }
            }
            // If we did not find any saved credentials then let's try to use Default Credentials which is
            // used for Integrated Authentication
            if (null == result)
            {
                WebProxy integratedAuthProxy = GetSystemProxy(uri);
                integratedAuthProxy.Credentials = _credentialProvider.DefaultCredentials;
                if (IsProxyValid(integratedAuthProxy, uri))
                {
                    result = integratedAuthProxy;
                }
            }
            // If we did not succeed in getting a proxy by this time then let's try and prompt the user for
            // credentials and do that until we have succeeded.
            if (null == result)
            {
                WebProxy     noCredentialsProxy = GetSystemProxy(uri);
                bool         validCredentials   = false;
                bool         retryCredentials   = false;
                ICredentials basicCredentials   = null;
                while (!validCredentials)
                {
                    // Get credentials for the proxy address and not the target url
                    // because we'll end up prompting the user for a proxy for each different
                    // package due to the packages having different urls.
                    basicCredentials = _credentialProvider.PromptUserForCredentials(systemProxy.Address, retryCredentials);
                    // If the provider returned credentials that are null that means the user cancelled the prompt
                    // and we want to stop at this point and return nothing.
                    if (null == basicCredentials)
                    {
                        result           = null;
                        retryCredentials = false;
                        break;
                    }
                    noCredentialsProxy.Credentials = basicCredentials;
                    if (IsProxyValid(noCredentialsProxy, uri))
                    {
                        validCredentials = true;
                    }
                    else
                    {
                        retryCredentials = true;
                        validCredentials = false;
                    }
                }
                result = noCredentialsProxy;
            }

            Debug.Assert(null != result, "Proxy should not be null here.");

            if (null != result)
            {
                _proxyCache.Add(systemProxy.Address, result);
            }

            return(result);
        }