为什么Apache Commons VFS考虑Http Proxy和Socks5 Proxy,而忽略Socks4 Pro



我正在开发一个连接到SFTP服务器并使用Apache Commons VFS下载文件的应用程序,它工作得很好,除了系统需要允许用户根据需要指定代理。

现在,我知道Apache Commons VFS建立在Jsch之上,我知道Jsch包含以下类:com.jcraft.jsch.ProxyHTTP,com.jcraft.jsch.ProxySOCKS4和com.jcraft.jsch.ProxySOCKS5。

下面的代码是VFS类org.apache.commons.vfs2.provider.sftp.SftpClientFactory的摘录:

public static Session createConnection(
...
final SftpFileSystemConfigBuilder.ProxyType proxyType = builder.getProxyType(fileSystemOptions);
...
final String proxyUser =  builder.getProxyUser(fileSystemOptions);
final String proxyPassword = builder.getProxyPassword(fileSystemOptions);
Proxy proxy = null;
if (SftpFileSystemConfigBuilder.PROXY_HTTP.equals(proxyType)) {
proxy = createProxyHTTP(proxyHost, proxyPort);
((ProxyHTTP)proxy).setUserPasswd(proxyUser, proxyPassword);
} else if (SftpFileSystemConfigBuilder.PROXY_SOCKS5.equals(proxyType)) {
proxy = createProxySOCKS5(proxyHost, proxyPort);
((ProxySOCKS5)proxy).setUserPasswd(proxyUser, proxyPassword);
} else if (SftpFileSystemConfigBuilder.PROXY_STREAM.equals(proxyType)) {
proxy = createStreamProxy(proxyHost, proxyPort, fileSystemOptions, builder);
}
...

如您所见,没有"if"语句来实例化 ProxySOCKS4! 我复制了 SftpClientFactory 类,将我的版本设置为在类路径上的原始类之前加载,并更改了代码,如下所示:

public static Session createConnection(
...
final SftpFileSystemConfigBuilder.ProxyType proxyType = builder.getProxyType(fileSystemOptions);
...
final String proxyUser =  builder.getProxyUser(fileSystemOptions);
final String proxyPassword = builder.getProxyPassword(fileSystemOptions);
Proxy proxy = null;
if (SftpFileSystemConfigBuilder.PROXY_HTTP.equals(proxyType)) {
proxy = createProxyHTTP(proxyHost, proxyPort);
((ProxyHTTP)proxy).setUserPasswd(proxyUser, proxyPassword);
/// change start  (I also created the PROXY_SOCKS4 constant)
} else if (SftpFileSystemConfigBuilder.PROXY_SOCKS4.equals(proxyType)) {
proxy = createProxySOCKS4(proxyHost, proxyPort);
((ProxySOCKS4)proxy).setUserPasswd(proxyUser, proxyPassword);
/// change end 
} else if (SftpFileSystemConfigBuilder.PROXY_SOCKS5.equals(proxyType)) {
proxy = createProxySOCKS5(proxyHost, proxyPort);
((ProxySOCKS5)proxy).setUserPasswd(proxyUser, proxyPassword);
} else if (SftpFileSystemConfigBuilder.PROXY_STREAM.equals(proxyType)) {
proxy = createStreamProxy(proxyHost, proxyPort, fileSystemOptions, builder);
}
...

...你猜怎么着,当我将我的应用程序设置为使用 Socks 4 代理时,它可以通过上面的更改正常工作。重要的是要说,如果代理服务器是 Socks 4 类型,则设置应用程序以使用 Socks 5 不起作用,这不仅适用于我的 VFS 应用程序,也适用于我测试的任何其他客户端,如 Fillezila 或 WinSCP。

所以,主要的问题是:
为什么VFS预测ProxyHTTP,ProxySOCKS5的使用,但完全忽略JSch ProxySOCKS4类?我在这里是否缺少一些SFTP或代理概念,或者我应该考虑VFS错误?这是我第一次与VFS合作。

请将粗体字的问题视为主要问题,不要使其过于宽泛。

我无法及时得到或找到更好的答案,所以我为解决问题所做的正是我在问题中描述的。

我复制了类 SftpClientFactory e SftpFileSystemConfigBuilder,进行了必要的调整并使用它们而不是原始类,这很丑陋,现在我被困在一个特定的 VFS 版本,我知道,但问题解决了。

下次的教训:使用Jsch而不是VFS。

不过,我会把这个问题留给大家,以防其他人有适当的解决方案或答案。

最新更新