【问题标题】:Ruby OpenURI FTP not working when username has spaces当用户名有空格时,Ruby OpenURI FTP 不起作用
【发布时间】:2013-06-27 19:58:29
【问题描述】:

我正在使用 Ruby 1.9.3 并正在运行以下命令:

open("ftp://user name:password@datafeeds.domain.com/1234/1234.txt.gz")

返回:

URI::InvalidURIError: bad URI(不是 URI?)

对用户名进行编码(用 %20 替换空格)也不起作用:

Net::FTPPermError: 530 Invalid userid/password

URI 在所有经过测试的浏览器和 FTP 客户端中都能正常工作 - 只是在使用 OpenURI 时不行。此外,使用 Net::FTP(由 OpenURI 包装)也可以正常工作:

require 'net/ftp'
ftp = Net::FTP.new
ftp.connect("datafeeds.domain.com", 21)
ftp.login("user name", "password")
ftp.getbinaryfile("/1234/1234.txt.gz")

知道为什么 OpenURI 方法不起作用,而 Net::FTP 方法起作用吗?谢谢。

【问题讨论】:

    标签: ruby ftp open-uri


    【解决方案1】:

    根据the specification 中的定义,URL 用户名只允许使用这些字符:

    user                   alphanum2 [ user ]
    [...]
    alphanum2              alpha | digit | - | _ | . | +  
    

    浏览器因忽视规范而臭名昭著,因此说他们支持它并不是一个好的证明。他们不应该符合规范。

    如果 cURL 支持它们,那么使用 Curb gem 看看是否能让你使用它们。

    【讨论】:

    • 谢谢。不确定你是否看到,但我在大约 5 分钟前编辑了这篇文章,以包含 Net::FTP 工作正常的事实。我们现在正在使用它,但理想情况下只使用 OpenURI(因为 Het::HTTP 也将在应用程序中使用)。
    • 上面的错字:Het::HTTP =>> Net::HTTP
    【解决方案2】:

    根据this StackOverflow answer,您应该能够转义用户名和密码中的特殊字符。你可以这样做:

    login = URI.escape('user name') + ':' + URI.escape('password')
    open("ftp://#{login}@datafeeds.domain.com/1234/1234.txt.gz")
    

    【讨论】:

    • 我也是这么想的,但是在这种情况下,将空格转换为“%20”会导致 FTP 身份验证错误。
    • 如果您尝试CGI.escape 样式转义,例如open("ftp://user+name:password@datafeeds.domain.com/1234/1234.txt.gz"),会发生什么?
    • 使用“user+name”代替“user name”时同样的问题。
    【解决方案3】:

    open-uri 在这件事上似乎被打破了。我对包含# 字符的密码也有类似的问题。

    我最终绕过了set_password,它不允许在密码中使用# 字符,直接设置URI 的@password 实例变量。

    uri = URI.parse(...)
    if uri.password
      uri.instance_variable_set "@password", "password_with_#_char"
    end
    open(uri) # now this works fine
    

    这很 hacky,但能胜任。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多