Ruby open" userinfo不受支持":带有基本身份验证的URL

时间:2015-12-03 09:53:55

标签: ruby ftp http-basic-authentication

我有很多以下格式的网址

当我尝试使用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

0 个答案:

没有答案