我有很多以下格式的网址
当我尝试使用ruby的https
方法加载图片时,会针对ftp
引发以下错误,但适用于open(URI.parse("ftp://user:pass@example.com/some_image.jpg")) # works
open(URI.parse("https://user:pass@example.com/some_image.jpg")) # throws error:
# ArgumentError: userinfo not supported. [RFC3986]
open
我发现(JSON parse from a Remote URL which requires a username and password)您可以为此url = URI.parse(url)
open(url, http_basic_authentication: [url.user,url.password])
提供基本的auth参数
uri = URI.parse(url)
uri_base = "#{uri.scheme}://#{uri.host}:#{uri.port}#{uri.path}"
uri_base += "?#{uri.query}" if uri.query
open(uri_base, http_basic_authentication: [uri.user,uri.password])
但这仍然会引发错误,因为网址仍包含用户/密码信息。
那么,从网址解析用户/密码信息的简单方法是什么?我通过像这样连接URL的各个部分来尝试它:
Net::FTPPermError: 530 User _ftp denied by SACL.
但这对FTP不起作用,会引发open
错误。
通过<{1}}和
https
的可选 http基本身份验证,是否可以轻松支持ftp
?
更新
我提出了以下解决方案,但它看起来有点黑客,我认为必须有更好的方法:
def download url
opts = {}
uri = URI.parse(url)
uri_base = "#{uri.scheme}://"
if uri.scheme=="ftp"
uri_base += "#{uri.user}:#{uri.password}@" if uri.user
else
opts[:http_basic_authentication] = [uri.user,uri.password] if uri.user
end
uri_base += "#{uri.host}:#{uri.port}/#{uri.path}"
uri_base += "?#{uri.query}" if uri.query
open(uri_base, opts)
end