0 votes
by (330 points)
edited

I'd like the SFTP client to automatically use the system wide proxy settings (under Windows XP+). Is this possible?

Cheers, Christian

Applies to: Rebex SFTP

1 Answer

+1 vote
by (58.9k points)
edited by

You can use the following GetDefaultProxy method to retrieve the system proxy settings.

The following system proxy types (which can be set in Internet Options/Connections/Lan Settings/Advanced) are supported:

  • Secure (https) ~ corresponds to HTTP CONNECT proxies - Rebex.Net.ProxyType.HttpConnect
  • Socks (version 4) ~ corresponds SOCKS 4A proxies - Rebex.Net.ProxyType.Socks4a

The other two options which can be set using system settings (FTP-only and HTTP-only proxies) are not suitable for other protocols.

var sftp = new Sftp();
sftp.Proxy = ProxyHelper.GetDefaultProxy();
//sftp.LogWriter = new ConsoleLogWriter(LogLevel.Info);
sftp.Connect("test.rebex.net", 22);
sftp.Login("demo", "password");

...

public static Proxy GetDefaultProxy()
{
    using (var registry = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"))
    {
        if ((int)registry.GetValue("ProxyEnable") == 1)
        {
            var proxyServer = (string)registry.GetValue("ProxyServer");
            if (!string.IsNullOrEmpty(proxyServer))
            {
                var proxy = new Proxy();
                foreach (string entry in proxyServer.Split(new char[] { ';' }))
                {
                    int n;
                    string hostAndPort;
                    if ((n = entry.IndexOf('=')) == -1)
                    {
                        if (entry.StartsWith("http://", StringComparison.Ordinal))
                            hostAndPort = entry.Substring(7);
                        else
                            hostAndPort = entry;
                        proxy.ProxyType = ProxyType.HttpConnect;
                    }
                    else
                    {
                        hostAndPort = entry.Substring(n + 1);
                        string type = entry.Substring(0, n);
                        if (type == "socks")
                            proxy.ProxyType = ProxyType.Socks4a;
                        else if (type == "https")
                            proxy.ProxyType = ProxyType.HttpConnect;
                        else
                            continue;
                    }

                    n = hostAndPort.IndexOf(':');
                    if (n < 1)
                        throw new ApplicationException("Invalid proxy format: " + hostAndPort);

                    proxy.Host = hostAndPort.Substring(0, n);
                    int port;
                    if (!int.TryParse(hostAndPort.Substring(n + 1), out port))
                    {
                        throw new ApplicationException("Invalid proxy port: " + hostAndPort);
                    }
                    proxy.Port = port;
                }

                if (proxy.ProxyType == ProxyType.None)
                    throw new ApplicationException("None of the default proxies is supported.");

                var proxyOverride = (string)registry.GetValue("ProxyOverride");
                if (proxyOverride != null)
                {
                    var bypassList = new List<string>();
                    foreach (string host in proxyOverride.Split(';'))
                    {
                        if (host == "<local>")
                            proxy.BypassProxyOnLocal = true;
                        else
                            bypassList.Add(host);
                    }
                    proxy.BypassList = bypassList.ToArray();
                }

                return proxy;
            }
        }
    }

    return new Proxy();
}
by (330 points)
edited

Thanks for letting me know! I'll check this out.

...