gpt4 book ai didi

java - 为什么 Apache Commons VFS 考虑 Http Proxy 和 Socks5 Proxy 而忽略 Socks4 Proxy?

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:12 28 4
gpt4 key购买 nike

我正在开发一个连接到 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 和 SftpFileSystemConfigBuilder 类,进行了必要的调整并使用它们代替了原始的类,它很丑陋,现在我陷入了特定的 VFS 版本,我知道,但问题已经解决了。

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

不过,我会保留这个问题,以防其他人有正确的解决方案或答案。

关于java - 为什么 Apache Commons VFS 考虑 Http Proxy 和 Socks5 Proxy 而忽略 Socks4 Proxy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57172198/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com