Exemplo n.º 1
0
        public static CFProxy[] ExecuteProxyAutoConfigurationURL(IntPtr proxyAutoConfigURL, Uri targetURL)
        {
            CFUrl url = CFUrl.Create(targetURL.AbsoluteUri);

            if (url == null)
            {
                return(null);
            }

            CFProxy[] proxies = null;

            var runLoop = CFRunLoop.CurrentRunLoop;

            // Callback that will be called after executing the configuration script
            CFProxyAutoConfigurationResultCallback cb = delegate(IntPtr client, IntPtr proxyList, IntPtr error) {
                if (proxyList != IntPtr.Zero)
                {
                    var array = new CFArray(proxyList, false);
                    proxies = new CFProxy [array.Count];
                    for (int i = 0; i < proxies.Length; i++)
                    {
                        CFDictionary dict = new CFDictionary(array[i], false);
                        proxies[i] = new CFProxy(dict);
                    }
                    array.Dispose();
                }
                runLoop.Stop();
            };

            var clientContext = new CFStreamClientContext();
            var loopSource    = CFNetworkExecuteProxyAutoConfigurationURL(proxyAutoConfigURL, url.Handle, cb, ref clientContext);

            // Create a private mode
            var mode = CFString.Create("Mono.MacProxy");

            runLoop.AddSource(loopSource, mode);
            runLoop.RunInMode(mode, double.MaxValue, false);
            runLoop.RemoveSource(loopSource, mode);

            return(proxies);
        }
Exemplo n.º 2
0
            static Uri GetProxyUri(CFProxy proxy, out NetworkCredential credentials)
            {
                string protocol;

                switch (proxy.ProxyType)
                {
                case CFProxyType.FTP:
                    protocol = "ftp://";
                    break;

                case CFProxyType.HTTP:
                case CFProxyType.HTTPS:
                    protocol = "http://";
                    break;

                default:
                    credentials = null;
                    return(null);
                }

                string username = proxy.Username;
                string password = proxy.Password;
                string hostname = proxy.HostName;
                int    port     = proxy.Port;
                string uri;

                if (username != null)
                {
                    credentials = new NetworkCredential(username, password);
                }
                else
                {
                    credentials = null;
                }

                uri = protocol + hostname + (port != 0 ? ':' + port.ToString() : string.Empty);

                return(new Uri(uri, UriKind.Absolute));
            }