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); Console.WriteLine("CFWebProxy: GetProxyUri: '{0}'", uri); return(new Uri(uri, UriKind.Absolute)); }
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); }